随机数安全的事
概述 随机数在计算机应用中使用的比较广泛,最为熟知的便是在密码学中的应用。本文主要是讲解随机数使用导致的一些Web安全风。 我们先简单了解一下随机数 分类 随机数分为真随机数和伪随机数,我们程序使用的基本都是伪随机数,其中伪随机又分为强伪随机数和弱伪随机数。 真随机数,通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等 伪随机数,通过一定算法和种子得出。软件实现的是伪随机数 强伪随机数,难以预测的随机数 弱伪随机数,易于预测的随机数 特性 随机数有3个特性,具体如下: 随机性:不存在统计学偏差,是完全杂乱的数列 不可预测性:不能从过去的数列推测出下一个出现的数 不可重现性:除非将数列本身保存下来,否则不能重现相同的数列 随机数的特性和随机数的分类有一定的关系,比如,弱伪随机数只需要满足随机性即可,而强位随机数需要满足随机性和不可预测性,真随机数则需要同时满足3个特性。 引发安全问题的关键点在于不可预测性。 伪随机数的生成 我们平常软件和应用实现的都是伪随机数,所以本文的重点也就是伪随机数。 伪随机数的生成实现一般是算法+种子。 具体的伪随机数生成器PRNG一般有: 线性同余法 单向散列函数法 密码法 ANSI X9.17 比较常用的一般是线性同余法,比如我们熟知的C语言的rand库和Java的java.util.Random类,都采用了线性同余法生成随机数。