当前位置:  开发笔记 > 编程语言 > 正文

SecureRandom:init一次或每次需要init?

如何解决《SecureRandom:init一次或每次需要init?》经验,为你挑选了2个好方法。

我们的团队正在使用SecureRandom生成密钥对列表(SecureRandom传递给KeyPairGenerator).我们无法就以下两个选项中的哪一个达成一致:

    每次我们需要生成密钥对时创建一个新实例

    初始化静态实例并将其用于所有密钥对

哪种方法通常更好,为什么

补充:我的直觉是第二种选择更安全.但我唯一的论点是基于伪随机性来自当前时间戳的假设的理论攻击:某人可能看到密钥对的创建时间,猜测周围时间间隔中的时间戳,计算可能的伪随机序列,并获得关键材料.

补充:我对基于时间戳的确定性的假设是错误的.这是Random和SecureRandom之间的区别.因此,看起来答案是:在安全性方面它并不重要.



1> Matthew McCu..:

对于SecureRandom,您可能需要考虑通过如下调用偶尔重新播种(在大多数情况下使用系统熵):

mySecureRandom.setSeed(mySecureRandom.generateSeed(someInt));

以便为潜在的攻击者提供一些不到无限的时间来发现你的密钥.

在Justice League博客上有一些关于这种考虑的好文章.


我已经投了这个,因为它包含正确的信息,但请注意,这个答案**没有回答**应该创建多少个实例的问题.

2> Gowri..:

java.util.Random类不同,java.security.SecureRandom类必须在每次调用时产生非确定性输出.

这意味着什么,在以下情况下java.util.Random,如果你每次需要一个新的随机数的时间来重新创建一个实例使用相同的种子,你将基本上得到了相同的每一次的结果.然而,SecureRandom是保证不这么做-那么,创建一个实例或每次不创建一个新的影响它生成的随机字节的随机性.

那么,从正常的良好编码实践角度来看,为什么会创建太多实例呢?


请不要将此作为使用相同PRNG的理由.文档是模棱两可的,如果它是_wrong_,你只是简单地破解了所有的密钥,就像将种子计算到PRNG一样简单.
如果使用相同的种子创建`SecureRandom`,那么每次都会获得相同的结果,至少在使用Oracle默认值时.只有当您使用`SecureRandom`种子本身或者使用`generateSeed`方法重新种植它时,才能保证非确定性行为.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有