博客园  :: 首页  :: 管理

关于Linux系统一般都会有如下两个文件,/dev/random和 /dev/urandom是 Linux 上的字符设备文件,它们是随机数生成器,为系统提供随机数

[root@qq-5201351 ~]# ls -l /dev/random /dev/urandom
crw-rw-rw- 1 root root 1, 8 Jul 17 08:50 /dev/random
crw-rw-rw- 1 root root 1, 9 Jul 17 08:50 /dev/urandom

随机数的重要性

随机数在计算中很重要。 TCP/IP 序列号、密码盐和 DNS 源端口号都依赖于随机数。

在密码学中,随机性无处不在,从密钥的生成到加密系统,甚至密码系统受到攻击的方式。没有随机性,所有加密操作都是可预测的,因此不安全。

随机数产生的原理

为了尽可能的做到随机,随机数生成器会收集系统环境中各种数据,比如:鼠标的移动,键盘的输入, 终端的连接以及断开,音视频的播放,系统中断,内存 CPU 的使用等等

生成器把收集到的各种环境数据放入一个池子 ( 熵池 ) 中,然后将这些数据进行去偏、漂白,主要目的也是使得数据更加无序,更加难以猜测或者预料得到

有了大量的环境数据之后,每次获取随机数时,从池子中读取指定的字节序列,这些字节序列就是生成器生成的随机数

/dev/random、/dev/urandom 的区别

/dev/urandom它返回指定请求数量的随机数,如果请求的数量非常庞大的话,返回的随机数可能是伪随机数,随机数质量稍差些,即使如此,它们对大多数应用来说已经足够了

/dev/random也是返回指定请求数量的随机数,但是它产生的随机数质量很高, 是属于真随机数, 主要用于需要高质量的随机数的地方,比如:生成加密密钥等。

为了保证随机数的质量,/dev/random只能返回熵池当前最大可用的随机二进制位,当请求超过这个值,就会阻塞,直到熵池中有足够的随机二进制位

伪随机 和 真随机

上面提到了 伪随机 和 真随机,这里的 “真” 和 “伪” 是相对的

伪随机数 是通过算法计算出来,它只具有计算随机性

真随机数来自于系统中各种环境噪音数据,再利用算法混淆,可以认为是完全随机的了,具有真实的随机性和计算随机性

但是,对于一些微型的Linux系统,它的环境噪音很少,而且噪音种类也比较固定,能被猜测到的概率会大大增加,那么它真实的随机性就大打折扣了,这时它产生的随机数的随机性 和 伪随机数已经差不多了

使用哪个随机数生成器

/dev/random和 /dev/urandom都是 Linux 上两个随机数生成器,那我们应用中使用哪一个呢,按照怎样的原则去选呢 ?

首先要明确一点,/dev/random和 /dev/urandom产生的随机数都是从同一个熵池 ( 主熵池 ) 中提取的,只有当各自的熵池耗尽了,它们的行为才有所不同:

/dev/random阻塞,而 /dev/urandom没有,但是此时它返,回的是用算法计算出来的伪随机数

一般有个规则,/dev/random产生的随机数质量高,主要用于一些安全方面,而且,它是阻塞的,对于大部分应用来说,这是不能接受的

对于 /dev/urandom,当熵池计数器足够的时候,产生真随机数,计数不够的时候,产生伪随机数,最重要的是 它不会阻塞,而且,对于绝大多数的应用来说,伪随机数也能很好的满足需求了

 

本文参考于:https://blog.csdn.net/fengye_csdn/article/details/120843570