这段代码安全吗?
SecureRandom randomizer = new SecureRandom(String.valueOf(new Date().getTime()).getBytes());
这是实例化安全随机种子的正确方法吗?
最佳答案
不,您应该避免使用 SecureRandom(byte[])
构造函数。它既不安全又不可携带。
它不可移植,因为它在 Windows 和其他操作系统上的行为不同。
在大多数操作系统上,默认算法是“NativePRNG”,它从操作系统(通常是“/dev/random”
)获取随机数据并忽略您提供的种子。
在 Windows 上,默认算法是“SHA1PRNG”,它将您的种子与计数器结合起来并计算结果的哈希值。
这在您的示例中是个坏消息,因为输入(以毫秒为单位的当前 UTC 时间)的可能值范围相对较小。例如,如果攻击者知道 RNG 是在过去 48 小时内播种的,他们可以将种子缩小到少于 228 可能的值,即你只有 27 位熵。
另一方面,如果您在 Windows 上使用默认的 SecureRandom()
构造函数,它会调用 native CryptoGenRandom
函数来获取 128 位种子。因此,通过指定您自己的种子,您已经削弱了安全性。
如果您真的想覆盖默认种子(例如用于单元测试),您还应该指定算法。例如
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed("abcdefghijklmnop".getBytes("us-ascii"));
另见 How to solve performance problem with Java SecureRandom?
和这篇博文:http://www.cigital.com/justice-league-blog/2009/08/14/proper-use-of-javas-securerandom/
关于java - Java 中的 SecureRandom 安全种子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249235/