Crypto.randomBytes处理exception做到熵不足?

在这个方法的文档中,如果没有足够的熵来产生数据,它将会抛出exception。 我的问题属于熵。 它是如何产生的,你可以通过提供适当的熵来防止抛出exception吗? 抛出exception多么普遍,还是未知?

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); }); 

生成密码强的伪随机数据。

如果没有足够的累积熵来生成密码强的数据,将抛出错误或调用错误的callback 。 换句话说,即使所有的熵源都被耗尽,没有callback的crypto.randomBytes也不会被阻塞。

在下面的例子中,我将如何正确处理exception,并且仍然完全填充数组,基本上确保数组已经完全填充了生成的字节。 我只是捕捉exception,并在catch块中生成一个新的数组,但如果这也会引发exception? 本质上,我如何使这段代码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) } 

如果没有可用的熵,最好的办法就是等一下再试一次。 需要等待多长时间取决于您需要多less熵以及底层熵源如何工作。

在实践中,我怀疑你会有什么问题。 我不知道Node.js在底下做了什么,在其他库中的等价函数通常被实现为调用操作系统的熵池 – 例如/dev/urandomCryptGenRandom() – 或者作为从操作系统的熵中播种的CSPRNG池。 无论如何,你永远不会阻止。

如果你正在从Linux上的/dev/random读取数据,封锁只是一个问题。 这是因为/dev/random可能会阻塞在Linux上,但不会在其他平台上。 如果您直接从硬件RNG读取,也可能是一个问题。