Java的库存Random
库包括Random
和SecureRandom
(我也看到了ThreadLocalRandom
)。 还有其他人吗?我什么时候才能使用它们?有时我会使用SecureRandom
来更好地理解我的简单数字。结果是SecureRandom
actually lets you pick your generator。 我应该如何以及何时使用此功能?
最后,Java 8提供了SecureRandom.getInstanceStrong()
。我不确定这是什么,但它比以前任何一个多慢。 我应该如何以及何时使用SecureRandom.getInstanceStrong()
?此外,由于噪音源已用尽,它是否会变慢?
答案 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像往常一样是一个很好的开端。