错误描述 :

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作为随机数据源)。

gpg生成秘钥时卡死相关推荐

  1. PGP生成秘钥对及应用

    PGPDesktop下载链接:https://download.csdn.net/download/hfy19981024/10438982 1.下载安装PGP 安装很简单,根据安装包中的步骤一步一步 ...

  2. 怎么用git在本地生成密钥_git上传代码到远程仓库(附:生成秘钥)

    1. 一开始使用git时,可能要使用到相关的密钥 生成秘钥的方法:(1)ssh-keygen -t rsa -C "github注册的邮箱名" 随后一直enter就好,提示输入密码 ...

  3. mysql通过ssl的方式生成秘钥

    -- mysql ssl 生成秘钥 1 check ssl是否已经开启mysql> show variables like '%ssl%'; +---------------+--------- ...

  4. linux生成license,License生成秘钥

    一 License 简介 开发的软件产品在交付使用的时候,往往会授权一段时间的试用期,这个时候license就派上用场了.不同于在代码中直接加上时间约束,需要重新授权的时候使用license可以避免修 ...

  5. java中secretkey,java生成秘钥key,并保存秘钥到文件中

    本例子采用的是Java的对称加密其中的一种方式(3DES),其他的加密方式也类似.生成一个key秘钥,发送方使用生成的key秘钥进行加密操作,然后把生成的key秘钥保存到文件中,提供给需要解密的一方使 ...

  6. java项目的秘钥怎么保存_java生成秘钥key,并保存秘钥到文件中

    本例子采用的是Java的对称加密其中的一种方式(3DES),其他的加密方式也类似.生成一个key秘钥,发送方使用生成的key秘钥进行加密操作,然后把生成的key秘钥保存到文件中,提供给需要解密的一方使 ...

  7. Shiro 生成秘钥

    Shiro 生成秘钥[官方] import org.apache.shiro.codec.Base64;import javax.crypto.KeyGenerator; import javax.c ...

  8. QT使用AES加密MAC地址生成秘钥文件并存取

    1.下载QT第三方AES库 https://github.com/bricke/Qt-AES 2.拷贝头文件 将aesni下的头文件添加到工程的头文件中 将AES库文件下的qaesencryption ...

  9. 12 | 生成秘钥对

    1 Linux生成密钥对 2 windows生成秘钥对 2.1 打开命令行窗口 win+r打开cmd控制台命令 2.2 进入到cd .ssh目录 2.3 执行ssh-keygen 3 通过工具使用 4 ...

最新文章

  1. OSChina 周二乱弹 ——假期综合症
  2. 强大的Vivado IP工具——自定义IP的使用
  3. Manacher 例题讲解
  4. 原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)
  5. 1093 字符串A+B (20分)
  6. python实践项目(五)
  7. PaintCode如何使用标签和画布?
  8. 内置函数、匿名函数、递归、二分法
  9. 使用MATLAB的trainNetwork设计一个简单的LSTM神经网络
  10. c语言中isupper用法,C语言 isupper()用法及代码示例
  11. python识别图片指定位置文字_python 识别图片中的文字信息方法
  12. 哈罗数据分析(SQL)笔试
  13. 学生签到系统c代码_C语言学生管理系统源码分享
  14. 7-191 百钱百鸡
  15. 【信息系统项目管理师】第七章 项目成本管理(考点汇总篇)
  16. 微信公众号开启开发者模式
  17. gz, bz2, bz, Z, tgz, zip, rar, lha, rpm等格式的解压……
  18. 华硕ezflash3找不到u盘_华硕笔记本电脑bios里面找不到u盘启动项怎么办
  19. Java+JSP政府机关公文文档收发管理系统(含源码+论文+答辩PPT等)
  20. 面试:Art虚拟机和Davlik虚拟机简要对比

热门文章

  1. matlab 中关于nargin 以及 varargin 函数的使用
  2. 牛客bfs:工厂流水线
  3. 兄dei,作为程序员的你,这些一直接触的词都念对了吗?
  4. Unity 入门笔记 - 02 - 各种动画
  5. 看了这个逻辑关系图,才更清晰为何不让你随便外出了
  6. 我的世界手机有php的开服器下载地址,我的世界手机版怎么联机 PE手机版开服教程...
  7. 正好杠杆炒股短期继续震荡筑底
  8. 明日之后什么服务器物品最便宜,明日之后:玩家晒物价最低的服务器,看到uzi标价,观众直接酸了...
  9. 官方scratch3.0正式发布,全面支持移动设备在线编程!
  10. 软件企业具体可享受哪些所得税优惠政策?