java - Java 中的 SecureRandom 安全种子

标签 java security encryption random cryptography

这段代码安全吗?

 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/

相关文章:

php - 是否有可能以某种方式为我的网站获取这个随机生成的 key 并访问 SQL?

java - 按下按键后打印一行两次

windows - 开始-> 运行对话框 - "Run as Administrator"复选框?

java - 验证用户名和加盐密码

javascript - Reactjs 中的高级设计问题 : Passing upload file data between components before sending to backend

java - 代码适用于 Windows JDK 7 但不适用于 Linux JDK 7

java - 传递字节数组;通过junit测试,但无法定期调用方法?

java链表复制构造函数和字符串构造函数

java - 使用 Maven 原型(prototype)(无 Velocity)时有没有办法只复制资源?

java - 我需要两个函数来加密 php 中的一些数据并在 java "correctly"中解密