在 SecureRandom 类中使用“SHA1PRNG”

2023-11-25

我有一个基本问题。为什么在 SecureRandom 类中使用“SHA1PRNG”。如果有人解释一下,将会很有帮助。提前致谢。

前任: SecureRandom.getInstance("SHA1PRNG");


Warning

我认为直接依赖这个算法是不好的。请参见这个答案关于SO我展示的地方why依靠具体的SecureRandom算法很糟糕。

请注意,尽管大多数运行时都会有一个提供者"SHA1PRNG"实现,Java规范做not需要算法的实现,因此可能会失败NoSuchAlgorithmException如果你简单地假设它总是存在。

简短的介绍

"SHA1PRNG"是伪随机数生成器的名称(名称中的 PRNG)。这意味着它使用 SHA1 哈希函数来生成随机数流。 SHA1PRNG是Sun当时推出的专有机制。

该实现的优点是 PRNG 独立于操作系统运行,它不依赖于例如/dev/random or /dev/urandom。这可以带来性能优势,并且还可能有助于防止操作系统熵池(系统随机性所依赖的数据)的耗尽。

算法的性质

SHA1 哈希函数用于创建 RNG 的输出,并在将种子信息用于 PRNG 之前对种子信息进行哈希处理。 SHA1PRNG 输出与内部状态分离(因此攻击者无法仅使用 RNG 的输出重新创建内部状态)。

内部状态相对较大(目前限制为 160 位,即 Java 1.7 中 SHA1PRNG 的哈希大小)。这意味着创建循环几乎是不可能的。如果多次遇到相同的内部状态,则会创建一个循环 - 以下状态也将是相同的(除非使用添加额外的熵)setSeed()).

不幸的是,没有可用的算法的明确描述,并且不同的提供者可能以不同的方式实现它,通常试图模仿 Java 的实现(有时很糟糕甚至不安全)。

确定性操作

PRNG 是确定性的。这意味着它们将始终从相同的输入材料(“种子”)生成相同的随机数流。然而,当首次访问随机池时,SUN SHA1PRNG 将从操作系统检索到的熵中为自己播种。在这种情况下,随机值将与真正的随机数生成器无法区分。

SUN SHA1PRNG 的一个特殊属性是,它将only使用给出的种子setSeed()如果它被称为before使用其中之一访问随机池nextXxx()检索随机值的方法。在这种情况下,流将仅取决于给定的种子和实现的算法;在这种情况下,PRNG 是完全确定性的;如果调用相同的方法,它将始终返回相同的“随机”值。

这在测试期间可能很有用,但是请不要在生产代码中依赖此属性。即使 SUN SHA1PRNG 实现也发生了变化,因此您不能依赖输出在不同版本中保持不变。

Notes

请注意,SHA1PRNG 的实现可能因 JCA 提供者/不同运行时而异。 Android 上的代码与 SUN SHA1PRNG 不同且稳定性较差。请仅使用SecureRandom其预期目的:生成安全随机值.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SecureRandom 类中使用“SHA1PRNG” 的相关文章

随机推荐