没有必要SecureRandom
通过调用播种 a ,实际上,除非您有一个非常好的熵源并且绝对不是熵源,否则不应该这样做。java.security.SecureRandom#setSeed
java.lang.System#currentTimeMillis
现在,从您的示例中,即使种子相同,它也会产生两个不同的输出。这是我DRBG
SecureRandom
在 Java 10 的实现中观察到的一种行为,其中产生的两个随机数在一次执行期间会有所不同,但如果程序重新启动则将保持不变:
public class SessionIdTest {
public static void main (String args[]) throws NoSuchAlgorithmException {
// Hardcoded seed to evidence the deterministic behavior when the program restarts.
long seed = 1000;
{
SecureRandom random = SecureRandom.getInstance("DRBG");
random.setSeed(seed);
BigInteger a = new BigInteger(130, random);
System.out.println(a);
}
{
SecureRandom random = SecureRandom.getInstance("DRBG");
random.setSeed(seed);
BigInteger a = new BigInteger(130, random);
System.out.println(a);
}
}
}
所以前一个总是会产生这样的东西:
724996208419722369188940556616693042555
796664555436785984208644362540465534270
并且一次执行中的不同值的原因在于每次DRBG
创建实现时都会更新全局状态。
现在,如果您尝试SHA1PRNG
实现,两个随机数将是相同的,并且它们将在程序重新启动时保持不变:
public class SessionIdTest {
public static void main (String args[]) throws NoSuchAlgorithmException {
// Hardcoded seed to evidence the deterministic behavior when the program restarts.
long seed = 1000;
{
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(seed);
BigInteger a = new BigInteger(130, random);
System.out.println(a);
}
{
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(seed);
BigInteger a = new BigInteger(130, random);
System.out.println(a);
}
}
}
所以前一个总是会产生这样的东西:
251586625089438840547467272692377284989
251586625089438840547467272692377284989
最后,在这两种情况下,您都可以确认存在基于提供的种子的确定性行为,因此,除非您有非常好的熵源,否则不要SecureRandom
手动播种这些 s,并且当前时间不是一个!. 让他们自己播种,这样更安全。