生成安全随机位

时间:2014-12-08 18:08:31

标签: java random cryptography

public static void main(String[] args)
{
    Random ranGen = new SecureRandom();
    ranGen.setSeed(0);

    int randomNumber = ranGen.nextInt(2);

    System.out.print(randomNumber);
}

上述代码是否是生成真正随机且安全/无偏0或1的好方法?

1 个答案:

答案 0 :(得分:1)

不,它不是(产生真正随机且安全/无偏0或1的好方法)。

new SecureRandom()没问题,但是在isn&t之后直接设置种子。 Oracle "SHA1PRNG"的实现 - 通常是默认设置 - 如果在从setSeed()检索到任何熵之前调用了SecureRandom,则替换初始种子随机数发生器。

如果没有播种,setSeed()实施将使用操作系统的熵源播种。这应该是相对安全的。通常,操作系统是唯一可以访问真实硬件设备的部分,因此它比JVM更适合检索熵。您可以调用nextBytes(),但只应在调用nextInt(2)后调用它,请求至少一个字节。之后,您可以一些种子添加到池中。

最后,调用nextBoolean()是可以的,但效率不高。它将请求32位,然后丢弃它不需要的31位。请求随机字节并从阵列中提取位将更有效(如果需要效率,则不要过度优化)。调用{{1}}可能只会丢掉7位,因此效率至少提高4倍,而且更加简洁。