SecureRandom的行为(Behaviour of SecureRandom)

2019-07-30 00:58发布

尽管下面的许多文章后SecureRandom ,我遇到了一个怀疑与使用SecureRandom安全API在Java中。 在下面的例子。

public class SecureRandomNumber {
public static void main(String[] args) throws NoSuchAlgorithmException {

    TreeSet<Integer> secure = new TreeSet<Integer>();
    TreeSet<Integer> unSecure = new TreeSet<Integer>();
    SecureRandom sr = new SecureRandom();
    byte[] sbuf = sr.generateSeed(8);
    ByteBuffer bb = ByteBuffer.wrap(sbuf);
    long d = bb.getLong();
    sr.setSeed(d);

    Random r = new Random();
    r.setSeed(System.nanoTime());
    for (int k = 0; k < 99999; k++) {
        int i = sr.nextInt();
        if (!secure.add(i)) {
            System.out.println("Repeated Secure Random Number");
        } else {
//              System.out.println("************Unique***********");
        }
        int j = r.nextInt();

        if (!unSecure.add(j)) {
            System.out.println("Repeated UnSecure Random Number");
        }
    }
}

}

当我运行这个程序,我没有找到使用任何额外的好处SecureRandom ,因为它几乎给出了相同的结果。

任何人都可以让我知道如果我在这里做正确的事情?

Answer 1:

你是受害者,对一般的随机数的共同misbelief:随机序列并不意味着一些不能在该序列重复。 恰恰相反,它必须有很高的几率。 这misbelief实际上是用来告诉从一个真实的人类产生的“随机”序列。 由人产生的“随机” 0和1的顺序可能会是这样的:

0,1,0,1,1,0,1,0,0,1,0,1,0,....

而一个真正的随机序列是不避讳重复相同的人数超过两倍:)一个很好的例子是, 统计检验也寻找重复。

这两种类型的发电机具有良好的“统计信息属性”

这也是一个常见的misbelief是加密的安全随机数会以某种方式产生“更随机”的价值观。 他们的统计概率可能会是差不多的,都将在这些标准的统计测试中表现非常好。

凡使用它

因此,它实际上取决于你想要做你的选择是否应该是一个PRNG或加密安全PRNG(CSPRNG)是什么。 “正常”的PRNG用于模拟的目的,如蒙特卡洛方法等。CSPRNG的额外好处会给你完美的罚款是,非预测性。 因为CSPRNG可以“做多”的机会是很高,其性能也比一个香草PRNG差。

可以示出该方式的概念的“安全” PRNG被紧密耦合到预测其输出的下一个位的能力。 对于CSPRNG,预测其输出的下一个位在任何时间在计算上是不可行的。 如果你把它的种子值作为一个秘密,当然,这只是成立。 一旦有人发现了种子,整个事情就变得容易预测 - 只是重新计算已经由CSPRNG的算法生成的值,然后计算下一个值。 进一步可以证明,被免疫“下位预测”实际上意味着,有没有统计检验任何能够从一个真正的随机均匀分布的区别CSPRNG的分布。 因此,有PRNG和CSPRNG之间的另一个区别:虽然一个好的PRNG将在许多统计测试表现良好,一CSPRNG是保证在所有测试中表现良好。

经验法则在哪里使用它是

  • 您可以使用CSPRNG处于“敌对”的环境下,你不希望的外部能够猜测的敏感信息(如真正赚钱的是韩元/丢失会话ID,在线扑克,....)
  • 而PRNG的慈善环境中,你只需要良好的统计特性,但不关心预见性(蒙特卡罗模拟,单人扑克与电脑,电脑游戏一般) - 即没有钱可以赢了还是生活会失物应有人能够成功地预测这些随机数字。


Answer 2:

安全和不安全的算法会经常给几乎相同的结果。 你不能检测输出一个安全漏洞。 与unpickable锁,并可以平凡采摘锁的门门看起来几乎相同,并没有,如果你只是把手柄将打开。 这是在编写安全代码和操作之类的加密和认证的原因之一是与设计,开发和测试特别专业技术编程的区域。



Answer 3:

SecureRandom的不保证唯一的随机数各一次。 它只是确保给前面的数字,你无法预测下一个随机数。 所以,基本上,你正在寻找错误的答案。

现在让我们使用骰子的例子。 使用安全随机像使用正常卸载骰子。 每个骰子都独立于先前骰子掷出的。 一个没有安全随机使用以前的掷骰子来决定下一个结果。 (所以如果你知道以前的卷是六,你可以预测未来骰子)。

所以,你基本上要确定它是否为您的应用问题,如果用户/黑客/管理者/等可以预测,如果给定的随机数的前面的列表其数字出来。 (在大多数情况下,这将是一个问题)。 如果你只是想使用随机数来选择随机的事情在网页中显示,正常的随机是好的。 如果你想使用随机数的安全性,或游戏,或交易,最好使用的SecureRandom。

我不知道,但我想使用的SecureRandom有一个非常小的开销增加。 所以随机稍微快一些。 但在大多数情况下,这种增长速度是不值得的潜在问题拉斯特当你的人滥用的不安全的随机数生成器的不安全感。



文章来源: Behaviour of SecureRandom