【问题标题】:Should I periodically reSeed SecureRandom or it occurs automatically?我应该定期 reSeed SecureRandom 还是自动发生?
【发布时间】:2017-12-31 02:15:08
【问题描述】:

我们使用SecureRandom如下(使用Java8):

import java.security.SecureRandom;
private SecureRandom random = new SecureRandom();

正在使用的算法是NativePRNG

我们应该定期播种吗?

如前所述,NativePRNG 不断从操作系统接收熵(通过从 /dev/(u)random 读取)

你怎么看?

【问题讨论】:

    标签: java security random secure-random


    【解决方案1】:

    Java8 文档说:SecureRandom 必须产生非确定性输出。

    【讨论】:

    • 那么 SecureRandom 会重新播种吗?你知道吗?
    • 并且相同的文档还说 “许多 SecureRandom 实现都是采用伪随机数生成器 (PRNG) 的形式,这意味着它们使用确定性算法来生成伪随机序列来自真正的随机种子。” 令人困惑。 Java9 为 SecureRandom 添加了reseed() 方法。如果某些东西不被认为是重要的功能,他们通常不会倾向于在他们的 API 中添加一些东西。
    【解决方案2】:

    https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/ 建议在生成“大量 PRNG 输出”时重新设置 SecureRandom 实例。但是,它并没有具体说明什么算作大量。这可能取决于使用的 SecureRandom 算法。

    Java 文档没有说明会进行重新播种。如果特定算法支持它,则需要在调用 SecureRandom.getInstance 时明确指定该算法。

    在 Java 9 中添加了基于 NIST.SP.800-90Ar1 的 DRBG 实现 (JEP 273)。这指定生成器应在种子寿命结束时自行重新播种。而且你还可以看到这是相应实现的:sun.security.provider.AbstractDrbg(字段reseedCounter)

    但是,请记住,并不要求所有 Java 平台都需要支持 DRBG(尽管可能大多数平台都会支持)。因此,请处理它不可用的情况或包括提供 DRBG 的安全提供程序。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      相关资源
      最近更新 更多