Javascript NodeJs Random String替代技术

时间:2014-02-27 00:00:47

标签: javascript node.js

为什么我应该选择其中一种技术在nodejs中生成随机字符串?

首先:

//var TOKEN_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var TOKEN_CHARS = 'abcdef0123456789';
var len = 24;

var chars = [];
for (var i = 0; i < len; i++) {
    var index = Math.floor(Math.random() * TOKEN_CHARS.length);
    chars.push(TOKEN_CHARS[index]);
}
console.log(chars.join(''));

第二

var token = require('crypto').randomBytes(len/2).toString('hex');
console.log(token);

乍一看,这些产品的输出看起来相似。我不完全理解,但据我所知,从研究Math.random()可能不是最好的技术,基于“种子”与系统时间有关并且不是真正随机的事实。然而,高度使用的连接库使用第一种技术,所以我认为它必须非常好。

如果我要使用第一种技术,那么使用注释掉的TOKEN_CHARS令牌是否更“安全”(仅仅因为每个角色有更多可能性)?

1 个答案:

答案 0 :(得分:1)

Math.random()是作为通用PRNG创建的,crypto.pseudoRandomBytes是OpenSSL库的一部分,并作为CSPRNG创建。因此,使用第二个是一个很好的理由。

  

如果我使用第一种技术,使用注释掉的TOKEN_CHARS将令牌更“安全”

没有。但是,如果您想在令牌中使用更多熵,则可以在第二种情况下使用.toString('base64'),这样它将使用64个字符来表示您的令牌。