我有一个使用随机数的站点。一切正常。但是随机数应该是多长或复杂。
我的小随机数制造者就是这样:
let generateNonce = (length = 32) => {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let nonce = '';
for (let i = 0; i < length; i++)
nonce += chars.charAt(Math.floor(Math.random() * chars.length));
return nonce;
};
调用generateNonce()
会返回类似hERnT30lr0G3Hw4b5eQCjuC423a3PcBl
的内容。
32个字符的数字,大小写字母。这足够复杂甚至是太长吗?
答案 0 :(得分:1)
请参见https://w3c.github.io/webappsec-csp/#security-nonces的CSP规范部分,其中:
[nonce values]的长度至少应为128位(在编码之前),并应通过加密安全的随机数生成器生成
问题中的hERnT30lr0G3Hw4b5eQCjuC423a3PcBl
值超过128位,因此可以。
但是Math.random()
并不安全。请参见https://stackoverflow.com/a/5651854/441757和https://security.stackexchange.com/q/181580/86150。请改用Crypto.getRandomValues
。
答案 1 :(得分:1)
在@sideshowbarker的帮助下,nonce生成器可能像这样(nodejs)
// require nodes native crypto module
const crypto = require('crypto');
// create 128 bit nonce synchronously
const nonce = crypto.randomBytes(16).toString('hex');
output = 1e31b6130c5be9ef4cbab7eb38df5491
crypto.randomBytes(size[, callback])
生成加密强度高的伪随机数据。 size参数是一个数字,指示要生成的字节数。