gpt4 book ai didi

java - SecureRandom 的行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:29:11 25 4
gpt4 key购买 nike

尽管在阅读了很多关于 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");
}
}
}

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

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

最佳答案

您普遍对随机数有一个普遍的误解:随机序列并不意味着该序列中的数字不能重复。恰恰相反,它很有可能会。这种误解实际上是用来分辨人类生成的“随机”序列与真实序列的区别。由人类生成的 0 和 1 的“随机”序列可能如下所示:

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

虽然一个真正的随机序列并不羞于重复相同的数字两次以上 :) 一个很好的例子是 statistical tests也寻找重复。

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

还有一种常见的误解是,加密安全的随机数会以某种方式产生“随机得多”的值。它们的统计概率可能非常相似,并且在那些标准统计测试中都表现得非常好。

哪里用哪个

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

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

什么地方用哪个的经验法则就是那个

  • 您在“敌对”环境中使用 CSPRNG,您不希望外部人员能够猜测敏感信息( session ID、真钱赢/输的在线扑克......)
  • 而 PRNG 在一个仁慈的环境中,您只需要良好的统计特性而不关心可预测性(蒙特卡洛模拟、单人扑克与计算机、一般的计算机游戏)——即没有钱可以赢或如果有人能够成功预测这些随机数,将会失去生命。

关于java - SecureRandom 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11099241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com