为了账号安全,请及时绑定邮箱和手机立即绑定

如何解决慢速Java‘SecureRandom’?

/ 猿问

如何解决慢速Java‘SecureRandom’?

慕仙森 2019-07-15 10:30:55

如何解决慢速Java‘SecureRandom’?

如果要在Java中使用加密强随机数,请使用SecureRandom..不幸的是,SecureRandom可能会很慢。如果它使用/dev/random在Linux上,它可以阻止等待足够的熵来建立。如何避免执行惩罚?

有人用过吗不寻常的数学作为解决这个问题的方法?

有人能确认这个性能问题在JDK 6中已经解决了吗?


查看完整描述

3 回答

?
慕前端131612

如果您想要真正的随机数据,那么不幸的是,您必须等待它。这包括一个SecureRandomPRNG。不寻常的数学不能比收集真正的随机数据更快SecureRandom,虽然它可以连接到互联网下载种子数据从一个特定的网站。我猜这不太可能比/dev/random在那里可以找到。

如果您想要一个PRNG,请这样做:

SecureRandom.getInstance("SHA1PRNG");

支持哪些字符串取决于SecureRandomSPI提供程序,但可以使用Security.getProviders()Provider.getService().

SHA1PRNG很受SHA1PRNG的喜爱,所以它可以广泛使用。它并不像PRNG那样特别快,但是PRNG只是在计算数字,而不是阻碍熵的物理测量。

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


查看完整回答
反对 回复 2019-07-15
?
慕粉4167745

您应该能够在Linux上选择速度更快但安全性稍低的/dev/urandom,使用:

-Djava.security.egd=file:/dev/urandom

但是,这不适用于Java 5和更高版本(JavaBug 6202721)。建议的解决办法是使用:

-Djava.security.egd=file:/dev/./urandom

(请注意额外的/./)


查看完整回答
反对 回复 2019-07-15
?
慕容4345310

在linux上,默认的实现是SecureRandomNativePRNG(源代码)这里),这往往是非常缓慢的。在Windows上,默认为SHA1PRNG,正如其他人指出的那样,如果您显式地指定Linux,也可以在Linux上使用它。

NativePRNG不同于SHA1PRNG和联合国教科文组织的数学反RNG因为它不断地从操作系统接收熵(通过从/dev/urandom)。其他PRNG在播种后不会获得任何额外的熵。

AESarriRNG比AESarriRNG快约10倍。SHA1PRNG,而IIRC本身比IIRC快两到三倍。NativePRNG.

如果您需要在初始化后获得熵的更快的PRNG,请查看是否可以找到福图纳..Fortuna实现的核心PRNG与AESarriRNG使用的相同,但也有一个复杂的熵池和自动重播系统。


查看完整回答
反对 回复 2019-07-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信