当前位置: 首页 > 知识库问答 >
问题:

安全随机性

柯昆
2023-03-14

尽管在阅读了许多关于securerandom的文章之后,我遇到了一个关于在Java中使用securerandom安全API的疑问。在下面的示例中。

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");
        }
    }
}

}

谁能让我知道我在这里做的是对的吗?

共有1个答案

农诚
2023-03-14

对于随机数,你是一个常见的错误信念的牺牲品:一个随机序列并不意味着一个数字不能在该序列中重复。恰恰相反,它不得不以很高的概率。这种误解实际上被用来区分人类产生的“随机”序列和真实序列。人类产生的0和1的“随机”序列很可能是这样的:

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

而一个真实的随机序列并不避讳重复相同的数字两次以上:)一个很好的例子是统计测试也寻找重复。

  • 在“敌对”环境中使用CSPRNG,您不希望外部人员能够猜测敏感信息(会话ID、赢/输真钱的在线扑克,...)
  • 和PRNG在一个友好的环境中,您只需要良好的统计特性,而不关心可预测性(蒙特卡罗模拟、单人扑克对计算机、一般的计算机游戏)--也就是说,如果有人能够成功地预测这些随机数,就不会赢钱或失去生命。
 类似资料:
  • 问题内容: 在多个线程之间共享该类的一个实例是否有效?并特别从多个线程调用? 问题答案: 从某种意义上讲,它是线程安全的,当被多个线程使用时仍会生成随机数。 Sun / Oracle JVM实现使用同步和AtomicLong作为种子来提高线程之间的一致性。但是,文档中似乎并没有在所有平台上对此进行担保。 我不会编写要求这种保证的程序,尤其是当您无法确定调用顺序时。

  • 问题内容: 用例:“我忘记了密码”按钮。我们找不到用户的原始密码,因为它以散列形式存储,因此唯一要做的就是生成一个新的随机密码,然后通过电子邮件发送给他。这就要求使用密码无法预测的随机数,而mt_rand不够好,因此通常我们不能假定托管服务将提供对操作系统的访问权以安装密码随机数模块等。因此,我在寻找一种方法在PHP本身中生成安全的随机数。 到目前为止,我提出的解决方案包括存储初始种子,然后针对每

  • 对PHP中的openssl_random_pseudo_bytes()做了一些研究,我注意到在PHP源代码中openssl_random_pseudo_bytes()函数的实现中。OpenSSL的RAND_pseudo_bytes函数用于生成返回值,而不是RAND_bytes也可以在OpenSSL中使用。 OpenSSL对这两个功能的文档如下: RAND_pseudo_bytes()将num伪随机

  • 问题内容: PHP的函数不能提供良好的随机数。因此,我开始使用据说效果更好的产品。但是这些结果有多好?有什么方法可以再次改善它们? 我的点子: 这应该给您“完美的”随机数,不是吗? 问题答案: 伪随机数生成器(PRNG)是非常复杂的野兽。 没有真正的“完美”随机数生成器-实际上,可以通过数学函数完成的最好的操作是伪随机数-对于大多数意图和目的,它们似乎足够随机。 实际上,从PRNG返回的数字中执行

  • 下面简单脚本并行产生随机数 在使用单个线程时,上述脚本是确定性 然而,当使用多个线程时,它是部分随机,且包含线程之间的相关性(这可能是一个相当大的问题 我明白为什么我的代码不是线程安全的,但我不明白如何使它是线程安全的。是否可以不考虑线程的数量而具有确定性的输出? 目标是使产生与相同的输出(即线程数不会影响对象)。如果这不可能,则目标是产生与相同的输出。

  • 如何在一定范围内生成安全的统一随机数?范围可能在0到100之间。(上限不是2的幂)。 <代码>java。安全SecureRandom似乎提供了范围0。。2^n。