randomBytes与pseudoRandomBytes
在什么情况下(从安全的angular度来看)使用节点的crypto.pseudoRandomBytes
而不是密码强的crypto.randomBytes
?
我认为 ,但是pseudoRandomBytes
performance会更好可以预测 ( 不正确 ),但是文档并没有太多的关于它的强度。
具体来说,我想知道如果我可以使用pseudoRandomBytes
生成一个CSRF令牌。
事实certificate, 使用默认的OpenSSL (与节点捆绑在一起,但是如果你自己构build的话,可以configuration不同的引擎 ), 随机数据生成algorithm对于两个randomBytes
( RAND_bytes
)是完全相同的,和pseudoRandomBytes
( RAND_pseudo_bytes
)。
这两个调用之间唯一的区别取决于您使用的节点版本:
- 在节点v0.12和之前的版本中,如果熵池尚未接收足够的数据,则
randomBytes
将返回一个错误。pseudoRandomBytes
将始终返回字节,即使熵池没有正确播种。 - 在节点v4和更高版本中,
randomBytes
熵池有足够的数据,randomBytes
才会返回。 这应该只需要几毫秒(除非系统刚启动)。
一旦熵池中有足够的数据,永远不会“耗尽”,所以一旦熵池满了 , randomBytes
和pseudoRandomBytes
之间绝对没有有效的区别。
因为使用完全相同的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实现类似,它可能不是默认播种,或者是由一个简单的值(如时间戳)播种。 无论如何,种子可能是非常容易被猜测的。