JDK 1.7安全随机发生器播种&不可预测

时间:2015-08-20 14:25:14

标签: java security random

我计划实施MersenneTwister算法进行随机生成。由于它不安全,因此需要设置从SecureRandom派生的种子

SecureRandom secureRandomGenerator = SecureRandom.getInstance("SHA1PRNG");
int seedSize = 100; 
int[] seed = new int[seedSize]; 
for (int i=0; i <seedSize; i++) { 
    seed[i] = secureRandomGenerator.nextInt(Integer.MAX_VALUE); 
}
randomGenerator = new MersenneTwister(seed);

我有两个问题

1)将种子设置为SHA1PRNG是个坏主意还是好主意?

2)如果这是个好主意,为SHA1PRNG设置种子以提高不可预测性的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

我认为如果它只是种子,那么每次应用程序启动时你只使用它一次,所以它不是一个很大的安全问题。任何好的安全随机算法(包括SHA1PRNG)对于种子都是好的。最有问题的地方是梅森捻线机本身。至少它的原始实现是不安全的,无论Wikipedia中所述的种子源如何:

  

本机形式的算法不具有加密安全性。原因是观察足够数量的迭代(在MT19937的情况下为624,因为这是生成未来迭代的状态向量的大小)允许人们预测所有未来的迭代。

因此,无论种子来源如何,如果攻击者设法从中获取足够数量,梅森捻线虫就会受到损害。