Types of randomness
Java的股票EDOCX1,0个库包括EDCOX1,0,EDCX1,2,(EDCOX1,3,3)。还有其他的吗?我什么时候用?有时我使用SecureRandom只是为了更好地理解我的简单数字。事实证明,SecureRandom实际上让你选择你的发电机。我应该如何以及何时使用这个?
最后,Java 8提供了EDCOX1×6。我不知道这是什么,但它比以前任何一个都慢得多。我应该如何以及何时使用SecureRandom.getInstanceStrong()?另外,是否因为噪声源耗尽而变慢?
- 你要问的很多问题都在你链接到的文档中有所描述。
- 您是否出于安全考虑使用随机号码?
- @????S?它们不能解释或比较和对比使用。
- @Richardtingle不是真的,但也许答案中应该包含安全问题。
- @西蒙,那真的没有理由使用SecureRandom。你只是在浪费CPU周期来隐藏你的随机数字,以防不存在的黑客入侵。
Random是可预测的,您只需要一个生成的数字的小序列,就可以在序列中前后移动。请参阅Java的随机函数的逆函数,以反转序列的例子。
SecureRandom不是。
ThreadLocalRandom试图修正Random不是线程安全的事实。
其他形式的随机数可能有不同的特点-你必须学习随机数的数学,才能在你提到的数字和任何其他算法之间达到平衡。
SecureRandom getInstanceStrong()(注:强)似乎是一个更强大的随机序列,对暴露长序列特别有弹性。
随机性
随机性可以用统计的方法来衡量——我不想在这里详细讨论,有大量的资源可以解释如何做到这一点。
比较容易想到一种生成统计随机序列的算法。但是,如果您只尝试统计的随机性,并期望它是加密数据的好来源,那么您就错了。你最好使用:
1 2 3 4 5
| private static int lastRandom = 0;
public static int nextRandom() {
return ++lastRandom;
} |
所生成的序列可能无法通过随机性的统计测试,但它几乎是可预测的。
可预测性
这是一个完全不同的数学问题,远远超出了一个简单的stackoverflow答案。如果您想生成一个根本不可预测的随机数字序列,您也可以使用盖革计数器或类似的不可预测硬件源。看看这里有什么有趣的讨论。
安全性
问题是,一个好的加密序列必须在使其难以复制和不使其无法复制之间找到平衡。一个不可能复制的随机数序列对于加密来说是无用的,因为您将永远无法复制相同的序列来解密。
在不变得不可能的情况下实现难以复制是密码学的梦想。同样有很多资源,但维基百科和往常一样,是一个很好的开端。
- 为什么SecureRandom不可预测?它不是程序/算法吗?没有什么是真正随机的(包括所谓的真随机数)。
- @一个随机数的两个基本性质是:(1)它是被公平选择的;(2)你不能预先预测它是什么。使用密码学方法,可以生成一系列满足这些条件的值。是的,如果你可以访问发电机的完整内部状态,你就可以预测未来的输出。但是对于一个安全的随机数生成器来说,根据过去的输出记录来预测未来的输出是非常困难的。
- @Ajmansfield是不是更安全的RNG使用更多"真实"的随机性,即噪音?
- @西蒙假设没有专业的硬件(或与具有专业硬件的机器的互联网连接),计算机就无法访问任何真正的随机性,更不用说更多了。
- "一个好的加密序列必须在使其难以复制而不使其无法复制之间找到平衡"=>不确定我是否理解这一部分:为什么您希望您的随机序列是可复制的?
- @如果你在另一端复制相同的序列来解密消息。
- @Oldcurmudgeon我还是不明白-有比使用可预测随机序列更好的加密/解密方法,不是吗?
- @是的,但是最好的方法是使用一个尽可能接近一次性PAD的随机序列,因为只有一次性PAD是不可破解的。我承认,大多数现代算法都需要宇宙的年龄才能破解,但它们仍然无法击败一次性PAD的圣杯。