为什么我应该选择其中一种技术在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令牌是否更“安全”(仅仅因为每个角色有更多可能性)?
答案 0 :(得分:1)
Math.random()
是作为通用PRNG创建的,crypto.pseudoRandomBytes
是OpenSSL库的一部分,并作为CSPRNG创建。因此,使用第二个是一个很好的理由。
如果我使用第一种技术,使用注释掉的TOKEN_CHARS将令牌更“安全”
没有。但是,如果您想在令牌中使用更多熵,则可以在第二种情况下使用.toString('base64')
,这样它将使用64个字符来表示您的令牌。