我计划实施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设置种子以提高不可预测性的最佳方法是什么?
答案 0 :(得分:3)
我认为如果它只是种子,那么每次应用程序启动时你只使用它一次,所以它不是一个很大的安全问题。任何好的安全随机算法(包括SHA1PRNG)对于种子都是好的。最有问题的地方是梅森捻线机本身。至少它的原始实现是不安全的,无论Wikipedia中所述的种子源如何:
本机形式的算法不具有加密安全性。原因是观察足够数量的迭代(在MT19937的情况下为624,因为这是生成未来迭代的状态向量的大小)允许人们预测所有未来的迭代。
因此,无论种子来源如何,如果攻击者设法从中获取足够数量,梅森捻线虫就会受到损害。