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

Posted

技术标签:

【中文标题】内容安全策略 (csp) 随机数:随机数应该多长时间或多复杂【英文标题】:Content Security Policy (csp) nonce: how long or complex should be a nonce 【发布时间】:2020-01-09 03:56:40 【问题描述】:

我有一个使用 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 个字符的数字、大小写字母。这是否足够复杂甚至太长?

【问题讨论】:

请参阅w3c.github.io/webappsec-csp/#security-nonces 的 CSP 规范部分,其中说 nonce 值 “应至少 128 位长(编码前),并且应通过加密安全的随机数生成器生成” 。你的hERnT30lr0G3Hw4b5eQCjuC423a3PcBl 有超过 128 位,所以没关系。但是 Math.random() 在密码学上并不安全。请参阅***.com/a/5651854/441757 和security.stackexchange.com/q/181580/86150 的说明。请改用 Crypto.getRandomValues() developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues。 @sideshowbarker 谢谢。非常有用和有用的链接。您能否将其发布为答案。 OK — 作为答案添加 【参考方案1】:

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

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

问题的hERnT30lr0G3Hw4b5eQCjuC423a3PcBl值超过128位,没关系。

但是Math.random() 在密码学上并不安全; https://***.com/a/5651854/441757 和 https://security.stackexchange.com/q/181580/86150。请改用Crypto.getRandomValues

【讨论】:

【参考方案2】:

在@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 参数是一个数字,表示要生成的字节数。

【讨论】:

以上是关于内容安全策略 (csp) 随机数:随机数应该多长时间或多复杂的主要内容,如果未能解决你的问题,请参考以下文章

忽略样式属性的内容安全策略随机数

如何为 HTML 属性设置内容安全策略

Security ❀ CSP Bypass 内容安全策略绕过

CSP nonce 实现是啥样的?

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过