关于随机数生成问题的新解决方案
2017-03-09 01:31
295 查看
关于随机数生成问题的新解决方案
之前遇到过一个Linux设备上由于随机数生成器运行过于缓慢,导致应用运行阻塞的问题,当时记录到了一篇文章JDBC Connection Reset问题分析。现在这个问题有了新的进展。针对随机数生成速度不能满足应用需要的问题,在JDBC Connection Reset问题分析中记录的解决方法是不使用默认的随机数生成器
/dev/random,换成
/dev/urandom。依据我厂密码学专家小组的最新研究进展,这种作法并不安全,因此各产品需要进行整改。
从随机性和安全性的角度来说,Linux原生支持的
/dev/random无疑是最好的选择,但这个设备最大的问题在于性能比较差,当应用对随机数的需求量比较大时,容易导致应用在获取随机数时被阻塞。而
/dev/urandom则通过降低随机性和安全性,来保证性能。如下是测试数据。
# time dd if=/dev/random of=/dev/null ibs=40 count=50 记录了3+47 的读入 记录了1+1 的写出 667 bytes copied, 102.463 s, 0.0 kB/s real 1m42.483s user 0m0.000s sys 0m0.000s # time dd if=/dev/urandom of=/dev/null ibs=40 count=50 记录了50+0 的读入 记录了3+1 的写出 2000 bytes (2.0 kB, 2.0 KiB) copied, 0.000285104 s, 7.0 MB/s real 0m0.002s user 0m0.000s sys 0m0.000s
从上述数据可以发现,如果单论随机数生成速度,相比于
/dev/urandom,
/dev/random的性能确实太差了。
整改的思路
限制随机数生成器的使用场景,仅用于生成种子,供其它随机数生成器来使用。自行实现随机数生成器。
购买专业的随机数生成器设备,满足应用的需求。
加快随机数生成器生成随机数的速度。
关于思路一
这种思路看起来很美好,按照不同的使用场景,区别对待随机生成器的使用方法,但实际操作起来有困难。比如:识别使用随机数生成器的代码的位置,以及关联的业务。在研产品和转维产品的代码量经过十几年的开发,代码量和复杂程度非常高,业务非常复杂,而明白人早已换过好几遍血,已经没有人可以讲清楚业务和代码。试问有谁愿意动手修改代码。
修改随机数使用方法,使用
/dev/random生成的随机数作为种子,提供给其它随机数生成器使用。困难同上,另外其它随机数生成器的可靠性需要经过时间的检验,使用方法的正确性也需要时间的检验。
假如业务完成了修改,还要验证修改是否生效,是否可以满足安全的要求。考验开发、测试人员耐心的时刻来了,对于在网运行十几年的应用,构造业务场景还是很有挑战的工作。
综上,这条路其实不可行。
关于思路二
海外对随机数生成器和相关算法的要求非常高,自研的组件想要满足标准,成本非常高。不由得感叹下玩密码学研究的圈子太小众了,虽然我厂专家的文章可读性很高,但对于帮助我理解PRNG、DRBG等词汇还是没啥帮助。当然了,根据我厂现有资料,一些大的平台软件确实提供了自研的随机数生成器。但是呢,存在各种各样的问题,比如使用不便或者性能不能满足要求等。作为产品的开发人员,抱平台的大腿是一种非常好的策略。但当平台提供的组件不能满足要求,或者抱不成大腿时,迫于安全风险的威胁和整改的压力,只能另选生路。
很不凑巧,Jakcie目前所在的产品没有大腿可抱,因而本思路不可行。
关于思路三
从专家给出的意见以及应用样例看,这个思路比较适合玩硬件的嵌入式产品,对于纯软件的业务来说,不太适合。因而本思路不可行。关于思路四
绕了一圈,回到了原点。如何提高随机数生成器的输出速度呢?我厂密码学专家给出了另外一种思路,借助haveged - A simple entropy daemon,提高/dev/random生成随机数的性能。
根据同事在Suse 11 Sp2上测试的结果,本方法非常有效。Jackie现在使用的Ubuntu是当前最新的16.10,但很可惜没有安装这款软件,所以没法验证。
该思路的优点在于,产品的存量代码完全不需要修改,只需要启用haveged服务即可满足应用对随机数的需求,这样测试人员也不需要投入时间。当然了,这种思路在实际运行中还是有点问题,比如现网运行的Suse有很多版本比较低,没有安装haveged,那么其实无法享受haveged带来的便利。这需要让一线销售和服务想办法,尽快把操作系统的版本升级到高版本。
参考资料
/dev/random和/dev/urandom的一点备忘/dev/random与/dev/urandom
Myths about /dev/urandom
/dev/urandom 不得不说的故事
读取 /dev/urandom or /dev/random 生成随机数
Pseudorandom number generator
Haveged
haveged - A simple entropy daemon
Is it appropriate to use haveged as a source of entropy on virtual machines?
How to add more entropy to improve cryptographic randomness on Linux
查看原文:http://www.jackieathome.net/archives/460.html
相关文章推荐
- 关于C++随机数生成中种子值设置的一点总结,解决随机数序列重复问题
- 关于无法加载已创建的布局文件的问题的解决方案以及已布局在对应的R文件中未生成相应ID的问题的解决
- 关于C程序生成随机数遇到的问题
- 关于c语言中随机数生成连续播种的问题(初学者向)
- 关于C++随机数生成中种子值设置的一点总结,解决随机数序列重复问题
- 关于Servlet生成验证码的src为什么要带随机数的问题
- asp.net关于页面不回发,不生成__doPostBack方法问题的完美解决方案
- 关于C#中随机数的生成问题
- asp.net关于页面不回发,不生成__doPostBack方法问题的完美解决方案
- 关于Gridview自动生成列后,手动设定的模板列位置问题解决方案
- 一些关于中文乱码问题的一些解决方案和经验
- 关于VS.NET --WEB服务器版本运行不兼容的问题解决方案
- 关于aspx文件生成静态页面问题与我的回答
- csdn论坛中关于在word中生成日历的问题的解答
- Java 关于中文乱码问题的解决方案与经验
- 关于MO打印时不能正确打印用DC自己画出来的图片的问题的解决方案
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- Java 关于中文乱码问题的解决方案与经验
- 关于aspx文件生成静态页面问题与我的回答
- JDK1.2关于JDBC中文问题的解决方案