在此方法的文档中,它声明如果生成数据的熵量不足,它将抛出异常。我的问题与熵有关。如何生成并且可以通过提供足够的熵来防止异常被抛出?抛出异常会有多常见,或者它是未知的?
crypto.randomBytes
的文档:
crypto.randomBytes(size,[callback])
// async
crypto.randomBytes(256, function(ex, buf) {
if (ex) throw ex;
console.log('Have %d bytes of random data: %s', buf.length, buf);
});
生成加密强大的伪随机数据。
如果没有足够的内容,将抛出错误或调用带有错误的回调 累积熵以生成加密强数据。在 换句话说,没有回调的crypto.randomBytes也不会阻塞 如果所有的熵源都耗尽了。
在下面的示例中,我将如何正确处理异常并仍然完全填充数组,基本上确保数组已完全填充生成的字节。我是否只是捕获异常并在catch块中生成一个新数组,但是如果它也会引发异常吗?基本上我如何在100%的时间内使这段代码正常工作?
var codes = [];
for(var i = 0;i < 100;i++){
(function(i){
crypto.randomBytes(256, function(ex, buf) {
if (ex) throw ex;
codes[i] = buf.toString('hex');
});
})(i)
}
答案 0 :(得分:2)
如果没有熵可用,最好的办法是等一下再试一次。您需要等待多长时间取决于您需要多少熵以及基础熵源如何工作。
在实践中,我怀疑你是否有任何问题。我不知道Node.js在幕后做了什么,其他库中的等效函数通常被实现为对OS的熵池的调用 - 例如/dev/urandom
或CryptGenRandom()
- 或作为从OS的熵池中播种的CSPRNG。在任何一种情况下,你都不会阻止。
如果您在Linux上从/dev/random
读取,则阻止只是一个问题。这是因为/dev/random
可能会阻止Linux,但不会阻止其他平台。如果您直接从硬件RNG读取,也可能是一个问题。