随机性的类型

Sim*_*ang 4 java java-8

Java的库存Random库包括RandomSecureRandom(我也看到ThreadLocalRandom).还有其他人吗?我什么时候才能使用?有时我SecureRandom只是为了让我的简单数字感觉更好.事实证明,SecureRandom实际上让你选择你的发电机.我应该怎样以及何时使用它?

最后,Java 8提供了SecureRandom.getInstanceStrong().我不知道这是什么,但它的很多比以前慢.我应该如何以及何时使用SecureRandom.getInstanceStrong()此外,它是否因为噪声源耗尽而变慢?

Old*_*eon 11

Random是可预测的,你只需要一小部分生成的数字,你就可以在序列中向前和向后走.有关反转序列的示例,请参阅Java的Random函数的反函数.

SecureRandom 不是.

ThreadLocalRandom是尝试修复Random不是线程安全的事实.

其他形式的随机可能具有不同的功能 - 您必须研究随机数的数学,以便能够在您提到的和任何其他算法之间取得平衡.

SecureRandom getInstanceStrong()(注意Strong)似乎是一个更强大的随机序列,对于暴露长序列特别有弹性.

随机性

随机性可以统计测量 - 我不会在这里详细说明,那里有大量的资源可以解释如何做到这一点.

考虑生成统计随机序列的算法相对容易.但是,如果您只尝试统计随机性并希望它是加密数据的良好来源,那么您就错了.你不妨使用:

private static int lastRandom = 0;

public static int nextRandom() {
  return ++lastRandom;
}
Run Code Online (Sandbox Code Playgroud)

生成的序列可能不会通过随机性的统计测试,但它将是可预测的.

可预测性

这是一个完全不同的数学问题,远远超出简单的StackOverflow答案.如果您想生成一个根本无法预测的随机数序列,您也可以使用Geiger计数器或类似的不可预测的硬件源.看看这里有一些有趣的讨论.

安全

问题是良好的加密序列必须在使其难以复制而不使其无法再现之间找到平衡.不可能重现随机数序列对加密是无用的,因为你永远无法重现相同的序列来解密.

实现难以复制而不会变得不可能是密码学的梦想.同样有很多资源,但维基百科像往常一样是一个很好的开端.

  • @SujanSivagurunathan 随机数的两个基本属性是(1)它是公平选择的,以及(2)您无法提前预测它将是什么。使用密码学方法,可以生成一系列满足这些标准的值。确实,如果可以访问生成器的完整内部状态,则可以预测未来的输出。但是对于安全的随机数生成器来说,根据过去的输出记录来预测未来的输出是极其困难的。 (2认同)