随机数分类
- 真随机数 : 通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等
- 伪随机数 : 通过一定算法和种子得出。软件实现的是伪随机数,其中难以预测的随机数称为强伪随机数,易于预测的随机数称为弱伪随机数
随机数特性
- 随机性 : 不存在统计学偏差,是完全杂乱的数列
- 不可预测性 : 不能从过去的数列推测出下一个出现的数
- 不可重现性 : 除非将数列本身保存下来,否则不能重现相同的数列
随机数的特性和随机数的分类有一定的关系,比如,弱伪随机数只需要满足随机性即可,而强位随机数需要满足随机性和不可预测性,真随机数则需要同时满足3个特性。
伪随机数的生成
我们平常软件使用和应用使用的都是伪随机数,伪随机数的生成实现一般是算法+种子
具体的伪随机数生成器一般有:
- 线性同余法
- 单向散列函数法
- 密码法
- ANSI X9.17
比较常用的一般是线性同余法,比如Java中的java.util.Random类,都采用了线性同余法生成随机数
随机数安全风险
随机数导致的安全问题一般有两个原因:
- 应该使用随机数,开发者并没有使用随机数.简单来说,当我们需要一个随机数的时候,但开发人员可能没有使用