randomBytes vs pseudoRandomBytes

时间:2013-08-08 15:37:27

标签: node.js security

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

我认为pseudoRandomBytes表现得更好,但代价是更可预测incorrect),但文档对于如何不太强大并没有多少说法它是。

具体来说,我想知道我是否可以使用pseudoRandomBytes来生成CSRF令牌。

3 个答案:

答案 0 :(得分:40)

事实证明,使用默认的OpenSSL (与节点捆绑在一起,但如果您已经构建了自己的,则可以configure different engines),{{3} } randomBytesRAND_bytes)和pseudoRandomBytesRAND_pseudo_bytes)完全相同。

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

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

一旦熵池被播种了足够的数据,它就永远不会“耗尽”,所以一旦熵池是randomBytespseudoRandomBytes 之间绝对没有效果差异全

由于使用完全相同的算法生成randrom数据,因此两次调用之间的性能没有差异(尽管有一次性的熵池播种)。

答案 1 :(得分:17)

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

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)
*/

答案 2 :(得分:0)

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