关于Linux系统/dev/random 和 /dev/urandom的随机数生成的说明
Posted on 2023-07-17 16:44 520_1351 阅读(212) 评论(0) 编辑 收藏 举报关于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
作者:一名卑微的IT民工
出处:https://www.cnblogs.com/5201351
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
由于博主的水平不高,文章没有高度、深度和广度,只是凑字数,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个卑微的IT民工!