在什么情况下(从安全角度来看)使用节点crypto.pseudoRandomBytes
而不是加密强crypto.randomBytes
?
我认为(incorrect),但文档对于如何不太强大并没有多少说法它是。pseudoRandomBytes
表现得更好,但代价是更可预测
具体来说,我想知道我是否可以使用pseudoRandomBytes
来生成CSRF令牌。
答案 0 :(得分:40)
事实证明,使用默认的OpenSSL (与节点捆绑在一起,但如果您已经构建了自己的,则可以configure different engines),{{3} } randomBytes
(RAND_bytes
)和pseudoRandomBytes
(RAND_pseudo_bytes
)完全相同。
两个调用之间的唯一区别取决于您正在使用的节点版本:
randomBytes
会返回错误。 pseudoRandomBytes
将始终返回字节,即使熵池没有正确播种。randomBytes
在熵池有足够数据之前不会返回。这应该只需几毫秒(除非系统刚刚启动)。一旦熵池被播种了足够的数据,它就永远不会“耗尽”,所以一旦熵池是randomBytes
和pseudoRandomBytes
之间绝对没有效果差异全
由于使用完全相同的算法生成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实现类似,它可能不是默认播种,也不是由一个简单的值(如时间戳)播种。无论如何,种子可能非常很容易猜到。