在PRNG中使用种子

时间:2013-03-09 04:24:08

标签: java random cryptography

在Java中,我使用“SHA1PNRG”生成伪随机数。我不知道这一代人的内部工作。什么种子价值最适合安全号码生成?我应该使用较小的数字作为种子还是较大的值作为种子?请善意给予适当的指导。

我的代码:

SecureRandom sr= SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);

我使用sr.nextInt(int)获取下一个值,seed是一个长数据类型变量。

3 个答案:

答案 0 :(得分:0)

用于种子的号码无关紧要。重要的是,每次启动程序时,都会为种子使用不同的编号。

PRNG或伪随机数生成器通过对种子执行计算来工作。它使用该计算的输出作为下一个随机数的种子,依此类推。 (这是一个简化,但它给你正确的想法。)因此,如果你使用相同的种子,PRNG将产生相同的数字序列。

典型的种子来自系统时间,或来自用户的按键或鼠标移动,或者每次程序运行时可能不同的其他值。

答案 1 :(得分:0)

当使用基于SHA-1的Hash_DRBG(确定性随机比特生成器)时,

NIST SP800-90A建议种子长度为440比特(即55字节)。 (该算法也在那里描述)。

但不仅是种子的长度,还有熵(“随机性”)。如果使用440位的零字符串初始化DRBG,尽管它的长度是一个糟糕的选择。

播种的目的是配置生成器的初始状态,以便攻击者无法预测随机数的序列。请记住,所有过程都是确定性的,然后一旦有人知道生成器的状态,他就能够从那一点开始重现随机序列。

您可以使用方法SecureRandom.generateSeed计算种子,该方法依赖于当前操作系统提供的熵源(例如,SeedGenerator of OpenJDK使用Linux上的/ dev / random和MS CryptoAPI on窗口)。

 SecureRandom sr= SecureRandom.getInstance("SHA1PRNG");     
 byte seed[] = random.generateSeed(55);
 sr.setSeed(seed);

答案 2 :(得分:0)

Maximin,如果您担心人们无法猜测种子(从而预测PRNG的输出),您应该使用实际随机种子。例如,使用程序运行的时间并不安全。

您不应通过直接呼叫setSeed来绕过内部播种机制。如果在调用java.security.SecureRandom.setSeed(long)之前调用java.security.SecureRandom.setSeed(byte[])java.security.SecureRandom.nextBytes(byte[]),则会绕过内部播种机制,并且仅使用提供的种子生成随机数。

几年前在http://www.cigital.com/justice-league-blog/2009/08/14/proper-use-of-javas-securerandom/

看Amit Thesi关于此主题的有用博客文章