您的位置:首页 > 其它

关于随机数生成问题的新解决方案

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: