gpg生成秘钥时卡死

错误描述 :

gpg --gen-key 时在提示如下信息后就无响应了 

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动

鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

解决方法:

两条命令即可,将随机文件random删除掉,建立一个random的软链接,源地址为urandom

mv /dev/random /dev/random.bak

ln -s /dev/urandom /dev/random

原因分析,/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态

random与urandom:

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

  这两个设备的差异在于:/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作为随机数据源)。

版权声明:本文为ck784101777原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:gpg生成秘钥时卡死_gpg生成密钥时超时-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值