简介
在信息学中,信息熵是用来描述系统混乱无序程度的物理量;系统的熵越大,系统就越无序,所含有用信息量越少,不确定度越大。
Linux内核中有一个熵池设备,专门收集来自系统环境的一些噪音,来产生高质量随机数序列;这些噪声主要来自于硬件设备发生中断的时间,用户点击鼠标的时间间隔,硬件噪声,磁盘活动等
/dev/random与/dev/urandom
这两个字符设备文件都是利用Linux内核的熵池来生成随机数,两者的区别主要在于:熵池内的熵不够的情况下,/dev/urandom会利用伪随机数生成器来生成随机数,而/dev/random会阻塞等待熵池数据被填充。
内核熵池属性参数
查看系统熵池的容量:cat /proc/sys/kernel/random/poolsize // 默认4096
查看从熵池中读取熵的阀值:cat /proc/sys/kernel/random/read_wakeup_threshold
查看当前系统熵池中拥有的熵数: cat /proc/sys/kernel/random/entropy_avail
(当entropy_avail中的值少于read_wakeup_threshold阀值,这时读取/dev/random会被阻塞)
一般来说,对于需要高安全性的场景,建议使用 /dev/random;对于需要高性能的场景,建议使用 /dev/urandom。但是,实际上,大多数情况下,/dev/urandom 的安全性也足够,并且速度更快。
使用案例:
1.利用cat命令读取随机数据流,通过od命令转为十六进制显示:
cat /dev/random | od -x
2.生成一个随机128字节的字符串:
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 128 | head -n 1
3.生成一个随机的数字:
cat /dev/urandom | tr -dc ‘0-9’ | fold -w 1 | head -n 1
4.$RANDOM是一个环境变量,每次调用时会生成一个随机整数:
echo $RANDOM
5.生成一个长度为16的随机数:
dd if=/dev/random bs=1 count=16
6.获取一个随机UUID:
cat /proc/sys/kernel/random/uuid
7.生成10个随机字节
head -c 10 /dev/random