随机性的类型

时间:2014-04-22 21:31:33

标签: java java-8

Java的库存Random库包括RandomSecureRandom(我也看到了ThreadLocalRandom)。 还有其他人吗?我什么时候才能使用它们?有时我会使用SecureRandom来更好地理解我的简单数字。结果是SecureRandom actually lets you pick your generator我应该如何以及何时使用此功能?

最后,Java 8提供了SecureRandom.getInstanceStrong()。我不确定这是什么,但它比以前任何一个慢。 我应该如何以及何时使用SecureRandom.getInstanceStrong()此外,由于噪音源已用尽,它是否会变慢?

1 个答案:

答案 0 :(得分:11)

Random是可预测的,您只需要生成一小部分生成的数字,您就可以在序列中前后行走。有关反转序列的示例,请参阅Inverse function of Java's Random function

SecureRandom不是。

ThreadLocalRandom试图修复Random不是线程安全的事实。

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

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

随机性

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

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

private static int lastRandom = 0;

public static int nextRandom() {
  return ++lastRandom;
}

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

可预测

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

安全

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

实现难以复制而不会成为不可能是密码学的梦想。同样有许多资源,但Wikipedia像往常一样是一个很好的开端。