博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
/dev/random和/dev/urandom的一点备忘
阅读量:7065 次
发布时间:2019-06-28

本文共 1813 字,大约阅读时间需要 6 分钟。

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 

我们之前在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'' -f2-

(3).  利用awk程序输出。ORS是awk的内置变量,指输出记录分割符,默认为\n。

脚本的输出结果:

 

对比用ssh-keygen生成的footprint,是不是挺像的? :D

http://blog.csdn.net/ohmygirl/article/details/40385083

 

你可能感兴趣的文章
Thinkphp学习04
查看>>
Html A标签中 href 和 onclick用法、区别、优先级别
查看>>
Visual Studio 有哪些好用的插件?
查看>>
linux编程获取本机网络相关参数
查看>>
选eMTC还是NB-IoT,不应该再是一个问题
查看>>
精通CSS+DIV网页样式与布局--滤镜的使用
查看>>
计算机基础知识
查看>>
fackbook的Fresco的多种图片加载方法以及解码过程
查看>>
物联网设备漏洞不断增加 五大安全层面随时检视
查看>>
ejb3中的@Schedule中的persistent属性的深入探索
查看>>
JAVA SERVLET 属性范围样例
查看>>
微信诈骗产业链,俩字儿是核心:杀熟
查看>>
记一个自己项目上线的全过程
查看>>
Tkinter之输入框操作
查看>>
AI要完爆人类?解密AlphaGo Zero中的核心技术
查看>>
阿里云首度公布策略无意布局云基础设施
查看>>
RvmTranslator 3.0 is released
查看>>
Mac禁用ipv6
查看>>
10 个原则让动画带你飞
查看>>
在线网络安全体验项目真能解决安全技术人才短缺吗?
查看>>