gpt4 book ai didi

java - 我们有种子后 random.nextBytes(bytes) 如何生成字节

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:09 25 4
gpt4 key购买 nike

我知道如果我们声明:

SecureRandom random=new SecureRandom();

它初始化生成随机数的默认算法是NativePRNG,它读取/dev/random来生成真正随机的种子。现在我们有了真正随机的 seed,它是 160 位大小,但我很困惑当我们调用 random.nextBytes(bytes); 时会发生什么。它如何从 seed 生成 bytes,是否再次读取 /dev/random 或其他内容。

谢谢。

注意:我正在寻找 linux/MAC box 中 java 7 的默认行为。

最佳答案

来自 Java API 文档:

Many SecureRandom implementations are in the form of a pseudo-random number generator (PRNG), which means they use a deterministic algorithm to produce a pseudo-random sequence from a true random seed. Other implementations may produce true random numbers, and yet others may use a combination of both techniques.

因此,nextBytes(bytes) 是否从 /dev/random 返回真正的随机字节,或者它是否返回从真正的随机种子生成的伪随机数取决于。第二种情况意味着使用最初的随机种子,通过对 SecureRandom 的任何调用生成确定性但看似随机(因此是伪随机)的数字序列。

Java 7 允许指定可配置的 PRNG 源,但在 Linux 上默认的是 NativePRNG 而在 Windows 上是 SHA1PRNG。您也可以在 Linux 上指定 SHA1PRNG,但默认选项 NativePRNG 更好。 SHA1PRNG 通过使用 SHA1 生成 PRNG 位和字节。在 Linux(可能还有其他 Unixes,机制是“NativePRNG”)上,算法从 /dev/random/dev/urandom 读取>,只要其中任何一个有足够的熵可用。为了完整起见,来自 random 的 Linux 手册页:

A read from the /dev/urandom device will not block waiting for more entropy. As a result, if there is not sufficient entropy in the entropy pool, the returned values are theoretically vulnerable to a cryptographic attack on the algorithms used by the driver.

因此,至少在 Linux 上,您的 SecureRandom 将具有一定数量的真正随机输出,直到 /dev/random 阻塞,因为熵不足,但是,如果您请求太多随机位,它们最终将开始由底层 /dev/urandom 机制生成,该机制可能使用 SHA1 或其他一些加密哈希算法PRNG.

最好创建一个 SecureRandom 而不要自己指定任何明确的种子,因为它会自己播种(默认情况下通过 /dev/random/dev/urandom 对于 Linux 上的 NativePRNG)有一个好的种子。每隔几分钟调用一次 nextBytes(bytes),即使字节数很大,在几乎任何情况下都不会成为问题。即使您正在使用 NativePRNG 并且它求助于通过 SHA-1 之类的东西从 /dev/urandom 获取伪随机字节,其输出仍然非常难以预测。

如果您要求千兆字节的随机性,最好重新播种,使用 SecureRandom 本身的一些输出或提供您自己的种子。请注意,向 setSeed() 提供任何类型的种子应该是安全的,因为 SecureRandom 通过将您提供的种子和之前的种子提供给类似SHA-1 或其他加密哈希算法。但是,最好在不提供自己的种子的情况下创建初始 SecureRandom

关于java - 我们有种子后 random.nextBytes(bytes) 如何生成字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21254006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com