我们的团队正在使用SecureRandom生成密钥对列表(SecureRandom传递给KeyPairGenerator).我们无法就以下两个选项中的哪一个达成一致:
每次我们需要生成密钥对时创建一个新实例
初始化静态实例并将其用于所有密钥对
哪种方法通常更好,为什么?
补充:我的直觉是第二种选择更安全.但我唯一的论点是基于伪随机性来自当前时间戳的假设的理论攻击:某人可能看到密钥对的创建时间,猜测周围时间间隔中的时间戳,计算可能的伪随机序列,并获得关键材料.
补充:我对基于时间戳的确定性的假设是错误的.这是Random和SecureRandom之间的区别.因此,看起来答案是:在安全性方面它并不重要.
对于SecureRandom,您可能需要考虑通过如下调用偶尔重新播种(在大多数情况下使用系统熵):
mySecureRandom.setSeed(mySecureRandom.generateSeed(someInt));
以便为潜在的攻击者提供一些不到无限的时间来发现你的密钥.
在Justice League博客上有一些关于这种考虑的好文章.
与java.util.Random
类不同,java.security.SecureRandom
类必须在每次调用时产生非确定性输出.
这意味着什么,在以下情况下java.util.Random
,如果你每次需要一个新的随机数的时间来重新创建一个实例使用相同的种子,你将基本上得到了相同的每一次的结果.然而,SecureRandom
是保证不这么做-那么,创建一个实例或每次不创建一个新的不影响它生成的随机字节的随机性.
那么,从正常的良好编码实践角度来看,为什么会创建太多实例呢?