小编典典

如何处理缓慢的 SecureRandom 生成器?

all

如果你想在 Java 中使用加密的强随机数,你可以使用SecureRandom.
不幸的是,SecureRandom可能会很慢。如果它/dev/random在 Linux 上使用,它可以阻止等待足够的熵建立。如何避免性能损失?

有没有人用Uncommon Maths来解决这个问题?

谁能确认这个性能问题已经在 J​​DK 6 中解决了?


阅读 153

收藏
2022-08-03

共1个答案

小编典典

如果您想要真正的随机数据,那么不幸的是您必须等待它。这包括SecureRandomPRNG 的种子。Uncommon Maths 无法比
更快地收集真正的随机数据SecureRandom,尽管它可以连接到互联网以从特定网站下载种子数据。我的猜测是,这不太可能比/dev/random可用的地方更快。

如果您想要 PRNG,请执行以下操作:

SecureRandom.getInstance("SHA1PRNG");

支持哪些字符串取决于SPI
提供程序,但您可以使用和SecureRandom枚举它们。Security.getProviders()``Provider.getService()

Sun 喜欢 SHA1PRNG,因此它被广泛使用。PRNG 的运行速度并不是特别快,但 PRNG 只会处理数字,而不是阻止熵的物理测量。

例外情况是,如果您在获取数据之前不调用setSeed(),那么 PRNG
将在您第一次调用next()或时自行播种nextBytes()。它通常会使用来自系统的少量真实随机数据来执行此操作。此调用可能会阻塞,但会使您的随机数来源比“将当前时间与
PID 一起散列,加
27,并希望最好”的任何变体更加安全。但是,如果您只需要游戏的随机数,或者如果您希望流在将来可重复使用相同的种子进行测试,那么不安全的种子仍然有用。

2022-08-03