Linux系统产生随机数/dev/random 和 /dev/urandom
1. 基本介绍
/dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。
这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用, /dev/random设备可以保证数据的随机性。/dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高。
使用cat 命令可以读取/dev/random 和/dev/urandom的数据流(二进制数据流,很难阅读),可以用od命令转换为十六进制后查看:
在cat的过程中发现,/dev/random产生的速度比较慢,有时候还会出现较大的停顿,而/dev/urandom的产生速度很快,基本没有任何停顿。
而使用dd命令从这些设备中copy数据流,发现速度差异很大:
从/dev/random中读取1KB的字节流:
从/dev/urandom 中读取1KB的字节流:
通过程序测试也发现:/dev/random设备被读取的越多,它的响应越慢.
使用PHP的加密扩展mcrypt时,mcrypt_create_iv()函数用于从随机源创建初始向量(initialization vector),该函数的签名为:
string mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] )
注意函数的第二个参数$source,在PHP 5.6.0以下的版本中,该参数默认是 MCRYPT_DEV_RANDOM,也就是说,mcrypt_create_iv默认从/dev/random设备获取随机数据源的。这在系统并发数较高时,系统无法提供足够的中断数,会导致访问进程挂起(锁住),从而无法正常响应。
一个简单的测试脚本如下:
1 <?php
2 define("MCRYPT_KEY","x90!-=zo2s");
3 $src = "test";
4
5 $size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
6 $iv = mcrypt_create_iv($size);
7 $encrypted = mcrypt_ecb(MCRYPT_BLOWFISH, MCRYPT_KEY, $src, MCRYPT_DECRYPT, $iv);//5.5+已废弃,请使用最新的API测试
我们之前在cat /dev/random的输出时已经发现,输出的随机数据流会出现较大的停顿。在并发数较大时,会造成读取进程的等待甚至无法响应。
幸好,我们可以指定第二个参数为MCRYPT_DEV_URANDOM使其强制使用/dev/urandom设备的随机数据流(PHP 5.6.0+版本中,已经默认使用/dev/urandom作为随机数据源)。
2. /dev/random和/dev/random的其他用途
1. 这两个伪设备可用于代替mktemp产生随机临时文件名:
cat /dev/urandom |od –x | tr –d ' '| head –n 1
可以产生128位(bit)的临时文件名,具有较高的随机性和安全性。
2. 可以模拟生成SSH-keygen生成的footprint,脚本如下:
1 #/bin/sh -
2 cat /dev/urandom |
3 od -x |
4 head -n 1|
5 cut -d ' ' -f 2- |
6 awk -v ORS=":"
7 '{
8 for(i=1; i<=NF; i++){
9 if(i == NF){
10 ORS = "\n";
11 }
12 print substr($i,1,2) ":" substr($i,3,2);
13 }
14 }'
对该脚本的简单解释:
(1). cat /dev/urandom | od -x | head -n 1 用于从随机设备中读取一行数据流并转换为16进制。该段的输出类似于:
(2). 由于第一列实际上是数据的偏移量,并不是随机数据流,再次用cut取出后面的几个字段:cut -d ' ' -f 2-
(3). 利用awk程序输出。ORS是awk的内置变量,指输出记录分割符,默认为\n。
脚本的输出结果:
对比用ssh-keygen生成的footprint,是不是挺像的? :D
Linux系统产生随机数/dev/random 和 /dev/urandom的更多相关文章
- linux系统产生随机数的6种方法
linux系统产生随机数的6种方法 方法一:通过系统环境变量($RANDOM)实现: [root@test ~]# echo $RANDOM 11595 [root@test ~]# echo $RA ...
- /dev/random 和 /dev/urandom的一点备忘
1. 基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys, ...
- /dev/random和/dev/urandom的一点备忘
1. 基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys, ...
- hostapd、/dev/random、/dev/urandom
在使用hostapd做软ap时,出现了random熵不够的问题,导致节点连接不上这个ap. 下面先解释一下/dev/random和/dev/urandom 先让我们从一个工程中遇到的实际问题开始,先上 ...
- Linux系统产生随机数的3种方法
Linux系统产生随机数的3种方法 方法一:生成8位随机数 [root@localhost ~]# echo "$RANDOM$(date +%N%t)" | md5sum | c ...
- /dev/random vs /dev/urandom
If you want random data in a Linux/Unix type OS, the standard way to do so is to use /dev/random or ...
- /dev/random 和 /dev/urandmon的差别
最近使用这两个设备的时候,发现 /dev/random生成随机数很慢:于是就查了查: 这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/d ...
- 怎么清理Linux系统磁盘空间占用大:/dev/xvda1
1.首先查看磁盘占用情况 df -h Filesystem Size Used Avail Use% Mounted on/dev/xvda1 20G 18G 621M ...
- /dev/random 和 /dev/urandom 的原理
/dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同样,/dev/nul ...
随机推荐
- stylus-loader (copy)
https://blog.csdn.net/xqnode/article/details/59777793 "stylus-loader": "^2.5.0", ...
- OneZero第四周第四次站立会议(2016.4.14)
1. 时间: 15:00--15:10 共计10分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...
- TClientDataSet[9]: 计算字段和 State
TClientDataSet 中计算字段有两种: Calculated(计算字段).InternalCalc(内部计算字段). 两者区别是: Calculated 在每次需要时都要重新计算; Inte ...
- poj3468 A Simple Problem with Integers(线段树/树状数组)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- 模拟APP存储空间、内存不足情况下软件正常运行
1.进行临界测试,手机盘空间存满的条件下应用会有何表现: 方法一:adb shell dd if=/dev/zero of=/mnt/sdcard/bigfile 方法二:哆啦A工具生成文件 2.内存 ...
- photoshop cc 2018破解补丁(pscc2018注册机) 附使用方法
1.下载破解程序 破解文件自行到 http://www.ddooo.com/softdown/109954.htm 下载 博主可以到本博客的文件-->pscc2018zcj_109954.ra ...
- sql server 小技巧(4) Sql server 排序时让空值排在最后
order by coalesce( u.sort, 2147483647) sql server 小技巧 集锦
- Linq与Lambda,神一般的工作效率
Linq与Lambda,神一般的工作效 通过对linq和lambda的学习,越发感觉linq和lambda的重要性,他们能极大地简化程序,同时提升程序的可读性,大大提升了我们的工作效率,在公司的 ...
- windows2008设置IIS服务器定时自动重启的方法
我们在使用windows2008下IIS服务器时会经常出现资源耗尽的现象,运行一段时间下来就会出现访问服务器上的网站时提示数据库连接出错,重启IIS后网站又能正常访问了,这个问题可能困扰了很多站长朋友 ...
- 包学会之浅入浅出Vue.js:开学篇(转)
包学会之浅入浅出Vue.js:开学篇 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门>书籍的翻译工作.目前专注前端图片优化与新技术的探研. ...