处理异常的Crypto.randomBytes是否对熵不足?

Mic*_*ael 7 javascript cryptography node.js

在该方法的文档中,它声明如果生成数据的熵量不足,它将抛出异常.我的问题与熵有关.如何生成并且可以通过提供足够的熵来防止异常被抛出?抛出异常会有多常见,还是未知?

文档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);
});
Run Code Online (Sandbox Code Playgroud)

生成加密强大的伪随机数据.

如果没有足够的累积熵来生成加密强数据,则会抛出错误或调用带有错误的回调.换句话说,即使所有熵源都耗尽,没有回调的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)
}
Run Code Online (Sandbox Code Playgroud)

use*_*031 2

如果没有可用的熵,最好的选择是稍等一下然后重试。您需要等待多长时间取决于您需要多少熵以及底层熵源的工作原理。

在实践中,我怀疑你不会遇到任何问题。我不知道 Node.js 在幕后做了什么,其他库中的等效函数通常作为对操作系统熵池的调用来实现 - 例如/dev/urandomor CryptGenRandom()- 或者作为从操作系统熵池中播种的 CSPRNG。无论哪种情况,你都不会阻塞。

仅当您在 Linux 上阅读时,阻塞才成为问题/dev/random。这是因为/dev/random在 Linux 上可能会阻塞,但在其他平台上不会。如果您直接从硬件 RNG 读取,这也可能是一个问题。