如果你想在 Java 中使用加密的强随机数,你可以使用SecureRandom. 不幸的是,SecureRandom可能会很慢。如果它/dev/random在 Linux 上使用,它可以阻止等待足够的熵建立。如何避免性能损失?
SecureRandom
/dev/random
有没有人用Uncommon Maths来解决这个问题?
谁能确认这个性能问题已经在 JDK 6 中解决了?
如果您想要真正的随机数据,那么不幸的是您必须等待它。这包括SecureRandomPRNG 的种子。Uncommon Maths 无法比 更快地收集真正的随机数据SecureRandom,尽管它可以连接到互联网以从特定网站下载种子数据。我的猜测是,这不太可能比/dev/random可用的地方更快。
如果您想要 PRNG,请执行以下操作:
SecureRandom.getInstance("SHA1PRNG");
支持哪些字符串取决于SPI 提供程序,但您可以使用和SecureRandom枚举它们。Security.getProviders()``Provider.getService()
Security.getProviders()``Provider.getService()
Sun 喜欢 SHA1PRNG,因此它被广泛使用。PRNG 的运行速度并不是特别快,但 PRNG 只会处理数字,而不是阻止熵的物理测量。
例外情况是,如果您在获取数据之前不调用setSeed(),那么 PRNG 将在您第一次调用next()或时自行播种nextBytes()。它通常会使用来自系统的少量真实随机数据来执行此操作。此调用可能会阻塞,但会使您的随机数来源比“将当前时间与 PID 一起散列,加 27,并希望最好”的任何变体更加安全。但是,如果您只需要游戏的随机数,或者如果您希望流在将来可重复使用相同的种子进行测试,那么不安全的种子仍然有用。
setSeed()
next()
nextBytes()