Java的库存Random库包括Random和SecureRandom(我也看到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计数器或类似的不可预测的硬件源.看看这里有一些有趣的讨论.
问题是良好的加密序列必须在使其难以复制而不使其无法再现之间找到平衡.不可能重现随机数序列对加密是无用的,因为你永远无法重现相同的序列来解密.
实现难以复制而不会变得不可能是密码学的梦想.同样有很多资源,但维基百科像往常一样是一个很好的开端.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |