我们的团队正在使用SecureRandom来生成密钥对列表( SecureRandom传递给KeyPairGenerator)。我们不能就以下两种选择中的哪一种选择达成协议:
哪种方法更好,为什么?
补充说:我的直觉是第二种选择更安全。但我唯一的论点是一种基于伪随机性是从当前时间戳导出的假设的理论攻击:有人可能会看到密钥对的创建时间,猜测周围时间间隔中的时间戳,计算可能的伪随机序列,并获得关键材料。
补充说:我关于基于时间戳的决定论的假设是错误的。这就是兰登和SecureRandom之间的区别。所以,看起来答案是:就安全性而言,这并不重要。
发布于 2008-11-17 14:15:07
与java.util.Random类不同,java.security.SecureRandom类必须对每个调用产生不确定的输出。
这意味着,在java.util.Random的情况下,如果每次需要新的随机数时都要用相同的种子重新创建一个实例,那么每次都会得到相同的结果。但是,SecureRandom保证不会这样做-因此,每次创建单个实例或创建一个新实例并不会影响它生成的随机字节的随机性。
那么,从正常的良好编码实践的角度来看,为什么要创建太多的实例呢?
发布于 2010-07-19 04:08:34
对于SecureRandom,您可能需要考虑通过这样的调用来偶尔重新播种(在大多数情况下使用系统熵):
mySecureRandom.setSeed(mySecureRandom.generateSeed(someInt));以便给潜在的攻击者一些更短的时间来发现你的钥匙。
在正义联盟博客上有一些关于这个问题的很好的评论。
发布于 2008-11-17 14:07:33
初始化静态实例并将其用于所有密钥对。这不会是随机的。
https://stackoverflow.com/questions/295628
复制相似问题