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'' -f2-

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

脚本的输出结果:

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

/dev/random和/dev/urandom的一点备忘相关推荐

  1. /dev/random和/dev/urandom

    /dev/random和/dev/urandom是unix系统提供的产生随机数的设备,很多应用都需要使用random设备提供的随机数,比如ssh keys, SSL keys, TCP/IP sequ ...

  2. /dev/random 和 /dev/urandom 的原理

    /dev/random和 /dev/urandom是 Linux 上的字符设备文件,它们是随机数生成器,为系统提供随机数 随机数的重要性 随机数在计算中很重要. TCP/IP 序列号.密码盐和 DNS ...

  3. /dev/random与/dev/urandom

    先让我们从一个工程中遇到的实际问题开始,先上log: D/WMT_ENV (   57): get sysparaethaddr W/BestCast(   57): httpSimplePostfa ...

  4. 使用/dev/random和/dev/urandom产生随机数

    一.介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys,SSL ...

  5. Linux中的虚拟设备/dev/null、/dev/zero、/dev/random和/dev/urandom

    Unix/Linux将每一个设备都当成一个文件,放在/dev目录下.这些文件有的对应着一个真实存在的物理设备:有的则代表一个虚拟设备,提供一些特定的功能. 下面介绍三个常用的虚拟设备: /dev/nu ...

  6. /dev/null 、/dev/zero、/dev/random、/dev/urandom

    Linux中的虚拟设备/dev/null./dev/zero./dev/random和/dev/urandom /dev/null 利用/dev/null来清除不必要的输出 把/dev/null看作& ...

  7. [Ubuntu]关于制作【Ubuntu】U盘启动盘一点备忘[亲测可行]

    1,从Ubuntu官网下载 https://ubuntu.com/download/alternative-downloads 我用的是Ubuntu 16.04 Desktop,上面页面有个种子可以下 ...

  8. 探秘Linux特殊设备文件:(/dev/null,/dev/zero,/dev/random,/dev/urandom等)

    目录标题 第一章:设备文件简介(Introduction to Device Files) 1.1 设备文件概述(Overview of Device Files) 1.2 设备文件类型(Types ...

  9. java响应很慢排插_服务响应时间慢:Java SecureRandom和/ dev / random - java

    我正在尝试调试Tomcat上部署的应用程序提供的一些慢速响应. 现在,我主要关注SecureRandom和/dev/random(其他一些可能的原因已被调查并排除). 模式如下: 第一个调用恰好在To ...

最新文章

  1. 『笔记』常用命名规则
  2. Andriod Studio 解决问题 Failed to resolve: com.android.support:appcompat-v7:28.+
  3. [SQL Server]无法创建 SSIS 运行时对象,请验证 DTS.dll 是否可用及是否已注册
  4. python顺序表代码_python实现顺序表的简单代码
  5. iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)...
  6. 微信摇一摇插件ios_微信开发平台 Jeewx-Boot
  7. OpenReports中文支持方案
  8. 深入理解Spring Redis的使用 (五)、常见问题汇总
  9. ubuntu13.10 编译时 关于链接xlib 库阶段出错的问题解决
  10. Flask爱家租房--房屋管理(搜索房屋列表)
  11. Bootloader启动过程
  12. 蓝桥杯之--神秘三位数
  13. 华为交换机vlan配置教程
  14. 【转】Simulink中matlab Function模块全局变量的使用方法总结
  15. 施工部署主要不包括_施工部署编制内容不包括( )_学小易找答案
  16. 【免费通配符 SSL证书 (支持 IP) 申请教程】
  17. 手机浏览器自动打开快应用?
  18. firewalld防火墙IP伪装和端口转发
  19. 一文总结图像生成必备经典模型(二)
  20. 区块链:雷电网络开发预览版

热门文章

  1. 一个函数就能实现将正数变成对应的负数和将负数变成对应的正数
  2. Matlab绘制圆柱侧面
  3. linux命令-进程(服务)管理
  4. Mac使用技巧:移除Mac开机密码或屏幕锁定密码的方法
  5. RStudio 安装后启动闪退,无法打开(windows)
  6. Tp5中接口数组对象转数组方法
  7. 如何用Java制作hwid验证_java - 将帐户登录+ HWID锁定添加到Java程序的最安全方法是什么? - SO中文参考 - www.soinside.com...
  8. 功放模块设计相关-工程经验
  9. ECDSA和ECDH原理
  10. 《Adobe Audition CS6中文版经典教程》——1.3 Windows配置