SecureRandom 的行为

2024-02-17

尽管在关注了很多文章之后SecureRandom,我在使用时遇到了疑问SecureRandomJava 中的安全 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");
        }
    }
}

}

当我运行这个程序时,我没有发现使用SecureRandom因为它几乎给出相同的结果。

谁能告诉我我在这里做的事情是否正确?


一般来说,您是对随机数的常见误解的受害者:随机序列并不意味着数字不能在该序列中重复。恰恰相反,它的概率很高。这种错误信念实际上被用来区分人类生成的“随机”序列和真实序列。人类生成的 0 和 1 的“随机”序列可能如下所示:

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

而真正的随机序列并不羞于重复相同的数字两次以上:) 一个很好的例子是统计检验 http://en.wikipedia.org/wiki/Statistical_randomness#Tests还要寻找重复。

两种生成器都具有良好的“统计特性”

人们普遍错误地认为,加密安全的随机数会以某种方式产生“更加随机”的值。他们的统计概率可能非常相似,并且在这些标准统计测试中都会表现得非常好。

哪里用哪个

因此,这实际上取决于您想要做什么,您的选择是 PRNG 还是加密安全 PRNG (CSPRNG)。 “普通”PRNG 非常适合模拟目的,例如蒙特卡罗方法等。CSPRNG 的额外好处是不可预测性。因为 CSPRNG 可以“做得更多”,所以它的性能也很可能会比普通 PRNG 差。

可以看出,“安全”PRNG 的概念与预测其输出的下一位的能力紧密结合。对于 CSPRNG,随时预测其输出的下一位在计算上是不可行的。当然,只有当你将其种子价值视为秘密时,这才成立。一旦有人找到了种子,整个事情就变得很容易预测——只需重新计算 CSPRNG 算法已经生成的值,然后计算下一个值。还可以进一步证明,不受“下一位预测”影响实际上意味着没有任何统计测试可以区分 CSPRNG 的分布与真实随机均匀分布的分布。因此,PRNG 和 CSPRNG 之间还有另一个区别:虽然好的 PRNG 在许多统计测试中表现良好,但 CSPRNG 保证在以下方面表现良好:all tests.

经验法则是在哪里使用哪个

  • 您在“敌对”环境中使用 CSPRNG,您不希望外部人员能够猜测敏感信息(会话 ID、赢/输真钱的在线扑克,......)
  • 而 PRNG 在一个仁慈的环境中,你只需要良好的统计特性,但不关心可预测性(蒙特卡洛模拟、单人扑克与计算机、一般的计算机游戏)——即,无法赢得金钱或失去生命。如果有人能够成功预测这些随机数,就会失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SecureRandom 的行为 的相关文章

随机推荐

  • 如何在张量流中按元素方式将张量的每一行乘以其余行

    我有一个像这样的张量 tf docs tf constant 0 2 1 1 2 2 2 1 3 5 2 2 dtype tf int32 我需要按元素将每一行乘以其余行 然后对结果求和 完成第一行后 我们将处理第二行和其余行 然后 所以结
  • 无点动态函数组合

    我正在尝试将这个函数重构为无意义的 function siblings me return R pipe family R reject equalsMe me me 我想通过me到管道中的函数以及值family返回 尝试了一些事情R us
  • 使用带有 Pathogen 的 .vim 插件

    我想使用 lustyjuggler 和 lustyExplorer 它们是 vim 插件 但我希望我们的 Pathogen 来管理它们 通常我解压 vim 插件 整个文件夹结构进入 vim bundle 但对于 lustyJuggler 和
  • 从另一个基于应用程序的类继承 UWP 应用程序类时,名称“AppClass”不存在于命名空间“...”中

    我想要实现的只是继承 UWP App 类 而不是从 Windows UI Xaml Application 类继承 而是从某个基类继承 从 标准 类继承 但是 当我这样做时 namespace MyNamespace sealed part
  • 单例时间跨多个区域触发 Azure Function

    我有一个时间触发的 Azure 函数部署在多个区域中 我希望在它们之间具有单例行为 例如 如果这些区域是美国西部和欧洲中部 我希望每次只运行其中一个区域 这能实现吗 As the 文档 https learn microsoft com e
  • 安装设备所有者应用程序的更新

    有谁知道更新发生时通过 Google Play 分发的设备所有者应用程序的生产行为是什么 正如我们所知 安装设备所有者应用程序涉及一些动机并且并不容易 重置为出厂默认设置 然后通过 NFC 为设备提供第二个设备等 因此 即使我们认为这一步已
  • g++ 两次链接同一个库会出现问题吗?

    我注意到 当我使用 gcc 制作应用程序并在链接阶段查看输出时 我看到以下库包含两次 home rb01 opt trx HEAD gcc 4 2 4 lib lib64 libstdc so 所以我只是想知道这是 g gcc 的问题还是第
  • 有什么解决方案可以将向量解包为 C++ 中的函数参数吗?

    我实际上正在考虑类似于 python 中的 运算符的东西 如下所示 args 1 2 4 f args C 中有类似的解决方案吗 我能想到的如下 template
  • NetBeans + GWT 2.2.0 + Maven编译问题

    我正在尝试使用 NetBeans 6 9 中的 Google Web Toolkit 创建 Maven Web 应用程序项目 我已按照该视频中显示的步骤进行操作 http www youtube com watch v M iVZ5TJ21
  • 我可以更改点图上的一个标记大小吗?

    使用 Seaborn 的pointplot我创建了以下图像 我想知道是否可以将每个标记的大小更改为唯一值 该图像是通过调用制作的 sns pointplot x Partying y Province ci 95 data df join
  • 发布表单时的 post 与 put

    当评估表单是否已提交时 我检查方法是否为 post 而不是 get 有人告诉我 这是一个好方法 可以了解表单是通过单击 提交 按钮提交的 而不仅仅是由在 url 中传递数据的脚本提交的 put 方法怎么样 看起来和 post 很相似 是否可
  • AngularJS $location 没有模板

    我想使用 locationProviderAngularJS 中的服务 无需在我的中渲染新的 HTML 模板ng view 我有一个div通过按需显示的元素ng show绑定到数据元素的存在 我想通过以下方式将其连接到浏览器位置 locat
  • 使用三元运算符的缺点

    我的源代码中有以下语句 int tableField1 int tableField2 int propertyField1 int propertyField2 if tableField1 null propertyField1 tab
  • 在C中将XImage写入.bmp文件

    我正在使用以下代码将 XImage 写入文件 bitmap0 bmp 但是当我在 fedora 中使用 imageViewer 打开新创建的文件时 它会给出 文件过早结束 错误并且不显示任何内容 谁能指出以下代码中的问题吗 typedef
  • Synthesia 可以很好地播放 MIDI 文件而没有任何音符关闭事件吗?

    我有一个 mid file this https pastebin com amkth128具体一个 除了标题块之外 这里是 MIDI 的相关部分 第一个轨道块仅包含元事件 并被描述为 4D 54 72 6B 00 00 00 52 Tra
  • 从公钥+私钥创建 RSAParamaters 对象

    我需要使用私钥和公钥 key 和 cer 文件 在 Net 中创建 RSAParameters 对象 是否可以在 Net 中做到这一点而不使用第三方软件 如果是这样 我应该去哪里寻找 我最终需要从该对象中提取指数 模数 D P Q DP D
  • XCode 4.3 命令行工具包校验和无效

    Apple 提供的用于使用 Xcode 4 3 安装命令行工具的软件包已损坏 我似乎需要它 因为我正在开发一些命令行工具 有没有人找到 Apple 提供的 Xcode 4 3 的替代命令行包 或者该主题的解决方法 Xcode 包含一个新的
  • 为什么指定的初始化器不能调用其基类中的辅助初始化器?

    根据文档 Objective C 中类的指定初始值设定项必须调用其基类的指定初始值设定项 另一个规则是辅助初始化器必须调用其自己类的指定初始化器 但是 如果遵循第二条规则 为什么指定的初始值设定项不能调用其基类中的辅助初始值设定项 这个基本
  • Flutter 每台设备一个帐户

    如何使一个帐户下的应用程序中只有一个用户 我使用 flutter firebase auth 电子邮件和密码 例如 我有一个帐户 只有我可以从我的设备登录 如果有人发现我的帐户 他将无法登录 谢谢你 我只是给你一个想法如何去做 在cloud
  • SecureRandom 的行为

    尽管在关注了很多文章之后SecureRandom 我在使用时遇到了疑问SecureRandomJava 中的安全 API 在下面的例子中 public class SecureRandomNumber public static void