/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

时间: 2024-10-07 22:21:15

/dev/random 和 /dev/urandom的一点备忘的相关文章

/dev/random和/dev/urandom的一点备忘

1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流. 这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用, /dev/random设备可以保证数据的随机

/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/urandom. These devices are special files. They can be read like normal files and the read data is generated via multiple sources of entropy in th

hostapd、/dev/random、/dev/urandom

在使用hostapd做软ap时,出现了random熵不够的问题,导致节点连接不上这个ap. 下面先解释一下/dev/random和/dev/urandom 先让我们从一个工程中遇到的实际问题开始,先上log: E/hostapd (  100): random: Cannot readfrom /dev/random: Try again I/hostapd (  100): random: Only 0/20bytes of strong random data available from

关于oracle的一点备忘

数据库无法回避的就是处理数据 情景:发票信息,很多公司员工在进行交易的时候,填写的发票信息都是一样的,所以公司员工往往想调用统一的发票信息,公司会计登录系统可以填写通用发票信息,为了生成订单简单,发票需要和员工号码绑定,所以发票的表里想要复制一份员工号为会计的发票信息,改动其中的员工号,发票id,创建时间,其余不变 不知道大家弄懂应用情境没,叙述能力有限. 解决:可以使用select into,但是感觉不方便和灵活.所以考略利用右边和存储过程,因为没有返回值,就不写函数了 上代码: create

死在/dev/random上

FOTA差分升级的时候有个retouch_binaries操作,我这里到了这一句就卡住了,等待的圈圈能转几天也不见完.后来发觉乱捅几下居然完了.找到一个解决此问题的patch,发现是将/dev/random修改成了/dev/urandom diff --git a/updater/install.c b/updater/install.c index a1acdb9..2f2631a 100644 --- a/updater/install.c +++ b/updater/install.c @

Linux中的随机数文件 /dev/random /dev/urandom

Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random.他们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回.熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等.如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了. 这就

docker+tomcat 启动时非常慢原因之JRE /dev/random阻塞

docker+tomcat 启动时非常慢,一般正常启动几十秒的,发现docker+tomcat启动竟需要几分钟,不可思议 根本原因是 SecureRandom 这个 jre 的工具类的问题.那为什么 SecureRandom generateSeed 这么慢,甚至挂在 Linux 操作系统呢? Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 类产生安全随机类 SecureRando

辛星解读/dev/null和/dev/zero

在类Unix系统中,/dev/null称为空设备,它是一个特殊的设备文件,它丢弃一切写入其中的数据,不过他会报告写入成功,读取它的话会立即得到一个EOF.在程序员行话中,尤其是Unix行话中,/dev/null被称为位桶,也就是bit   bucket,也可以称之为黑洞,即black  hole.这个空设备通常被用于丢弃不需要的输出流,或者作为用于输入流的空文件.这些操作通常由重定向完成. 当我们使用cat  $filename 的时候,如果对应的文件不存在,那么系统会产生错误信息,我们就可以禁

Linux系统中有关/dev/null和/dev/zero文件说明及实践

Linux系统中有关/dev/null和/dev/zero文件说明 提示:这个题目完全可以作为一个面试题考考运维的应聘者: 面试题:请解释Linux中/dev/null和/dev/zero两个文件的作用和区别. 在类Unix操作系统中,设备节点并不一定要对应物理设备.没有这种对应关系的设备被称之为伪设备.操作系统运用了它们实现多种多样的功能,/dev/null和/dev/zero就是这样的设备,类似的还有/dev/urandom./dev/tty等. 先检查下/dev/null和/dev/zer