• /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 = "
    ";
    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的内置变量,指输出记录切割符。默觉得 。

    脚本的输出结果:

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

  • 相关阅读:
    微信公众号迁移配置注意点
    关于memcache 命令查看和 Telnet
    centOS 安装(光安装 和 u盘安装)
    CentOS删除自带的java,安装新java
    ubuntu常用命令
    ubuntu 的挂起与休眠
    saiku应用的调试
    数据挖掘123
    unbutu 安装java教程
    workbench的schema讲解一:(维度dimension设置的基本内容)
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6803128.html
Copyright © 2020-2023  润新知