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

时间:2014-07-05 01:56:30

标签: javascript node.js cryptography

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

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

1 个答案:

答案 0 :(得分:2)

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

在实践中,我怀疑你是否有任何问题。我不知道Node.js在幕后做了什么,其他库中的等效函数通常被实现为对OS的熵池的调用 - 例如/dev/urandomCryptGenRandom() - 或作为从OS的熵池中播种的CSPRNG。在任何一种情况下,你都不会阻止。

如果您在Linux上从/dev/random读取,则阻止只是一个问题。这是因为/dev/random可能会阻止Linux,但不会阻止其他平台。如果您直接从硬件RNG读取,也可能是一个问题。