randomBytes与pseudoRandomBytes

在什么情况下(从安全的angular度来看)使用节点的crypto.pseudoRandomBytes而不是密码强的crypto.randomBytes

我认为pseudoRandomBytesperformance会更好 ,但是可以预测 ( 不正确 ),但是文档并没有太多的关于它的强度。

具体来说,我想知道如果我可以使用pseudoRandomBytes生成一个CSRF令牌。

事实certificate, 使用默认的OpenSSL (与节点捆绑在一起,但是如果你自己构build的话,可以configuration不同的引擎 ), 随机数据生成algorithm对于两个randomBytesRAND_bytes )是完全相同的,和pseudoRandomBytesRAND_pseudo_bytes )。

这两个调用之间唯一的区别取决于您使用的节点版本:

  • 在节点v0.12和之前的版本中,如果熵池尚未接收足够的数据,则randomBytes将返回一个错误。 pseudoRandomBytes将始终返回字节,即使熵池没有正确播种。
  • 在节点v4和更高版本中, randomBytes熵池有足够的数据, randomBytes才会返回。 这应该只需要几毫秒(除非系统刚启动)。

一旦熵池中有足够的数据,永远不会“耗尽”,所以一旦熵池满了randomBytespseudoRandomBytes之间绝对没有有效的区别。

因为使用完全相同的algorithm来生成randrom数据,两个调用之间的性能没有差别(尽pipe有一次性的熵池播种)。

只是澄清一下,两者都有相同的performance:

 var crypto = require ("crypto") var speedy = require ("speedy"); speedy.run ({ randomBytes: function (cb){ crypto.randomBytes (256, cb); }, pseudoRandomBytes: function (cb){ crypto.pseudoRandomBytes (256, cb); } }); /* File: t.js Node v0.10.25 V8 v3.14.5.9 Speedy v0.1.1 Tests: 2 Timeout: 1000ms (1s 0ms) Samples: 3 Total time per test: ~3000ms (3s 0ms) Total time: ~6000ms (6s 0ms) Higher is better (ops/sec) randomBytes 58,836 ± 0.4% pseudoRandomBytes 58,533 ± 0.8% Elapsed time: 6318ms (6s 318ms) */ 

如果它与其他语言中的标准PRNG实现类似,它可能不是默认播种,或者是由一个简单的值(如时间戳)播种。 无论如何,种子可能是非常容易被猜测的。