【问题标题】:JDK 1.7 Secure Random Generator seeding & unpredictabilityJDK 1.7 安全随机生成器播种和不可预测性
【发布时间】:2015-08-20 14:25:13
【问题描述】:

我计划实现 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 设置种子以提高不可预测性的最佳方法是什么?

【问题讨论】:

    标签: java security random


    【解决方案1】:

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

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

    因此,无论种子来源如何,如果攻击者设法从中获得足够的数字,梅森捻线器都可能受到威胁。

    【讨论】:

    • 那么有什么替代方法呢?
    • @sunrise76,为什么不使用 SecureRandom 本身而不是编写自己的 Mersenne twister?
    • 我正在使用 MT 算法,因为它的周期很长,即 (2 power 624 - 1)。数字系列只会在那个时期之后重复,这将需要数年时间。这是大约 8 年前开发的。我不知道 java SecureRandom 期间和内部结构。
    • @sunrise76,完全没有必要观察整个时期来预测随后的数字。短得多的序列就足够了。例如,java.util.Random 有类似 2 power 48 的句号,但 afaik 单个 nextLong 结果足以预测后续数字。
    • 例如见this code
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2013-09-24
    • 2015-03-14
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多