内容安全策略 (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) 随机数:随机数应该多长时间或多复杂的主要内容,如果未能解决你的问题,请参考以下文章
Security ❀ CSP Bypass 内容安全策略绕过