当前位置: 首页 > 面试题库 >

Java中的SecureRandom安全种子

柴英博
2023-03-14
问题内容

这段html" target="_blank">代码安全吗?

 SecureRandom randomizer = new SecureRandom(String.valueOf(new Date().getTime()).getBytes());

这是确定安全随机种子的正确方法吗?


问题答案:

不,您应该避免使用SecureRandom(byte[])构造函数。它既不安全又不可携带。

它是不可移植的,因为它在Windows和其他操作系统上的行为有所不同。

在大多数操作系统上,默认算法是“ NativePRNG”,该算法从操作系统(通常是"/dev/random")获取随机数据,而忽略您提供的种子。

在Windows上,默认算法为“ SHA1PRNG”,该算法将您的种子与计数器结合在一起,并计算结果的哈希值。

在您的示例中,这是个坏消息,因为输入(当前UTC时间(以毫秒为单位))具有相对较小的可能值范围。例如,如果攻击者知道RNG是在过去48小时内播种的,则他们可以将种子缩小到小于2
28个可能的值,即,您只有27位熵。

另一方面,如果您SecureRandom()在Windows上使用了默认构造函数,则它将调用本机CryptoGenRandom函数来获取128位种子。因此,通过指定您自己的种子,可以削弱安全性。

如果您确实想覆盖默认种子(例如,用于单元测试),则还应指定算法。例如

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed("abcdefghijklmnop".getBytes("us-ascii"));

另请参阅如何使用Java SecureRandom解决性能问题?
和此博客文章:http : //www.cigital.com/justice-league-
blog/2009/08/14/proper-use-of-javas-
securerandom/



 类似资料:
  • 问题内容: 是线程安全的?也就是说,在初始化它之后,是否可以依赖访问下一个随机数来保证线程安全?检查源代码似乎表明事实确实如此,并且此错误报告似乎表明它缺乏作为线程安全的文档是javadoc的问题。有没有人确认它实际上是线程安全的? 问题答案: 是的。它扩展了,始终具有 事实上的 线程安全实现,并且从Java 7开始,它明确地保证了线程安全。 如果许多线程使用单个,则可能存在争用,从而影响性能。另

  • root@112ecdd0b71f:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/java.security 但是,我希望在容器启动之前自动启动,因为当前的设置需要tomcat大量的时间才能启动。

  • 问题内容: 在我们的代码库中找到以下代码: 在这里,将创建一个默认值,然后使用该默认值为另一个种子创建种子,该种子将在本课程的稍后版本中使用。这真的有必要吗?因为这样做了,第二个比第一个好吗? 当第二秒生成种子时,给出了字节数,这重要吗?难道一个比另一个不同数量的字节播种可能是好还是坏?用于播种的字节数是否应该与将用于的字节数相对应? 如果未调用setSeed,则对nextBytes的第一次调用将

  • 这是密码生成盐的正确方式吗? 我正在尝试生成新的密码(SHA-512),所以我也需要一个salt。 散列密码将是=用户密码+salt...这是正确的吗? 这些奇怪的字符会“破坏”数据库(MySQL)吗?(更新:不,因为salt应该被加密/编码/散列,结果不应该使用奇怪的字符) 更新:

  • 因此,我们创建了一个包含一些私有类成员的简单类,并自动为其生成getter。但getter实际上返回了对该成员的引用,从而获得了对私有成员的完全访问权。这样可以吗?下面是一个类的代码: 主要方法代码: 和输出: [字符串1,字符串2] [字符串1、字符串2、字符串3] 我已经将getter更改为这个: 但问题仍然是,如果不是为了安全,吸气剂的作用是什么?什么是正确的书写方式?

  • 问题内容: 有关Singletons的维基百科文章提到了一些用线程安全的方法来用Java实现结构。对于我的问题,让我们考虑具有冗长的初始化过程并且一次被多个线程访问的Singleton。 首先,这个未提及的方法是线程安全的吗?如果是的话,它在什么上进行同步? 其次,为什么以下实现线程安全且在初始化时是懒惰的?如果两个线程同时进入该方法,到底会发生什么? 最后,在第二个示例中,如果一个线程首先获取一