内容安全政策(csp)随机数:随机数应为多长时间或复杂度

时间:2019-09-06 09:20:39

标签: content-security-policy nonce

我有一个使用随机数的站点。一切正常。但是随机数应该是多长或复杂。

我的小随机数制造者就是这样:

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个字符的数字,大小写字母。这足够复杂甚至是太长吗?

2 个答案:

答案 0 :(得分:1)

请参见https://w3c.github.io/webappsec-csp/#security-nonces的CSP规范部分,其中:

  

[nonce values]的长度至少应为128位(在编码之前),并应通过加密安全的随机数生成器生成

问题中的hERnT30lr0G3Hw4b5eQCjuC423a3PcBl值超过128位,因此可以。

但是Math.random()并不安全。请参见https://stackoverflow.com/a/5651854/441757https://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参数是一个数字,指示要生成的字节数。