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

    xiaoxiao2021-03-25  111

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

    之前遇到过一个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/urandomMyths about /dev/urandom/dev/urandom 不得不说的故事读取 /dev/urandom or /dev/random 生成随机数Pseudorandom number generatorHavegedhaveged - A simple entropy daemonIs 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
    转载请注明原文地址: https://ju.6miu.com/read-8298.html

    最新回复(0)