crypto.randomBytes熵源消耗
我尝试使用crypto.randomBytes()
方法生成非常大量(> 1GB)的伪随机数据,但是我无法产生排空的熵源的exception,以查看在这种可能的exception情况下我的应用程序的行为。
从Node.JS文档:
注意:如果没有足够的累积熵来生成密码强的数据,将会抛出错误或调用错误的callback。
我的问题是:
如何排除所有的熵源,使crypto.randomBytes()
产生一个exception?
简短的回答是 – 你不能 。
稍微长一点的答案是 – 这取决于操作系统。 我假设你使用Linux。 从理论上讲,Linux中的熵池可以通过以下脚本轻松排除:
#!/bin/bash while true; do # write how much entropy is left cat /proc/sys/kernel/random/entropy_avail # drain a little bit dd if=/dev/random of=/dev/null bs=1 count=1 2> /dev/null done
运行这个脚本最终会阻止使用/dev/random
,而不是/dev/urandom
。 Urandom不直接从熵池读取,它使用PRNG并使用/dev/random
每60秒重新设置一次(默认)。 那么当熵池干涸时会发生什么? 没有。 PRNG将不被重新使用,但是它仍然会生成新的数字,只是密码不够强大。
唯一一次这个例外可能被抛出,就是系统第一次启动后。 我猜这是不太可能的……当然其他操作系统可以以不同的方式处理这个问题,但是只要使用Linux,就不用担心这个问题。