[Linux] 如何在 Linux 中提取随机数

如何在 Linux 中提取随机数

一、设备文件

/dev/random & /dev/urandom

字符特殊文件 /dev/random 和 /dev/urandom (存在于Linux 1.3.3.0) 为内核提供了随机数生成接口。文件 /dev/random 具有主要设备编号1以及次要设备编号8。文件 /dev/urandom 具有主要设备编号1以及次要设备编号9。

二、俩者区别

发生器有一个容纳噪声数据的熵池,在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止。这样的设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。


/dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

/dev/random也允许写入,任何用户都可以向熵池中加入随机数据。即使写入非随机数据亦是无害的,因为只有管理员可以调用ioctl以增加熵池大小。Linux内核中当前熵的值和大小可以通过访问/proc/sys/kernel/random/文件夹中的文件得到。

三、生成随机数

低强度

head -n10 /dev/urandom | tr -cd "a-zA-Z" | fold -w 10

提示1: tr 命令中 -c 表示使用 "a-zA-Z" 进行替换补充,由 -d 负责删除其他(ex:Space etc...)。

提示2: fold 命令中 -w 表示使用 width 模式,即:宽式选择 10 个 “a-zA-Z”。

另一种方法

openssl rand -base64 100 | fold -w 10

四、深入学习资料

https://en.wikipedia.org/wiki//dev/random

https://www.2uo.de/myths-about-urandom/

posted @ 2017-10-04 16:08  季文康  阅读(1510)  评论(0编辑  收藏  举报