如何加密验证网页要求?
How to cryptographically verify web page requisites?
如何加密验证 HTML 中的网页要求?
例如,如果我有一些外部资源,如图像、样式 sheet 或(最重要的)内容分发网络上的脚本,是否可以强制客户端浏览器在使用前以加密方式验证下载资源的哈希值?是否有一些 HTML 属性或 URL 方案,或者是否必须手动编写一些 JavaScript 才能做到这一点?
基本原理是在 HTML 中提供通过 HTTPS 服务的散列可以额外防御受损(或故障)CDN-s。
关于 SO 的相关问题:
- How secure are CDNs for delivering jQuery?
截至 2016 年 6 月 23 日 Subresource Integrity is a W3C Recommendation which allows you to do just that (draft version here). According to the Implementation Report 它已在 Firefox 43 和 Chrome 45 中实现。
一个使用子资源完整性的简单示例如下:
<script src="https://example.com/example.js"
integrity="sha256-8OTC92xYkW7CWPJGhRvqCR0U1CR6L8PhhpRGGxgW4Ts="
crossorigin="anonymous"></script>
也可以在完整性字段中指定多个算法哈希对(称为元数据),以空格分隔并忽略无效数据(§3.3.3). The client is expected to filter out the strongest metadata values (§3.3.4), and compare the hash of the actual data to the hash values in set of the strongest metadata values (§3.3.5)以确定资源是否有效。例如:
<script src="https://example.com/example.js"
integrity="
md5-kS7IA7LOSeSlQQaNSVq1cA==
md5-pfZdWPRbfElkn7w8rizxpw==
sha256-8OTC92xYkW7CWPJGhRvqCR0U1CR6L8PhhpRGGxgW4Ts=
sha256-gx3NQgFlBqcbJoC6a/OLM/CHTcqDC7zTuJx3lGLzc38=
sha384-pp598wskwELsVAzLvb+xViyFeHA4yIV0nB5Aji1i+jZkLNAHX6NR6CLiuKWROc2d
sha384-BnYJFwkG74mEUWH4elpCm8d+RFIMDgjWWbAyaXAb8Oo//cHPOeYturyDHF/UcnUB"
crossorigin="anonymous"></script>
如果客户端理解 SHA256 和 SHA384,但不理解 MD5,则它通过空格标记 integrity
属性的值,并将 md5-
元数据标记作为垃圾丢弃。然后,客户端确定元数据中最强的哈希值是 SHA384,并将它们的值与接收到的实际数据的 SHA384 哈希值进行比较。
如何加密验证 HTML 中的网页要求?
例如,如果我有一些外部资源,如图像、样式 sheet 或(最重要的)内容分发网络上的脚本,是否可以强制客户端浏览器在使用前以加密方式验证下载资源的哈希值?是否有一些 HTML 属性或 URL 方案,或者是否必须手动编写一些 JavaScript 才能做到这一点?
基本原理是在 HTML 中提供通过 HTTPS 服务的散列可以额外防御受损(或故障)CDN-s。
关于 SO 的相关问题:
- How secure are CDNs for delivering jQuery?
截至 2016 年 6 月 23 日 Subresource Integrity is a W3C Recommendation which allows you to do just that (draft version here). According to the Implementation Report 它已在 Firefox 43 和 Chrome 45 中实现。
一个使用子资源完整性的简单示例如下:
<script src="https://example.com/example.js"
integrity="sha256-8OTC92xYkW7CWPJGhRvqCR0U1CR6L8PhhpRGGxgW4Ts="
crossorigin="anonymous"></script>
也可以在完整性字段中指定多个算法哈希对(称为元数据),以空格分隔并忽略无效数据(§3.3.3). The client is expected to filter out the strongest metadata values (§3.3.4), and compare the hash of the actual data to the hash values in set of the strongest metadata values (§3.3.5)以确定资源是否有效。例如:
<script src="https://example.com/example.js"
integrity="
md5-kS7IA7LOSeSlQQaNSVq1cA==
md5-pfZdWPRbfElkn7w8rizxpw==
sha256-8OTC92xYkW7CWPJGhRvqCR0U1CR6L8PhhpRGGxgW4Ts=
sha256-gx3NQgFlBqcbJoC6a/OLM/CHTcqDC7zTuJx3lGLzc38=
sha384-pp598wskwELsVAzLvb+xViyFeHA4yIV0nB5Aji1i+jZkLNAHX6NR6CLiuKWROc2d
sha384-BnYJFwkG74mEUWH4elpCm8d+RFIMDgjWWbAyaXAb8Oo//cHPOeYturyDHF/UcnUB"
crossorigin="anonymous"></script>
如果客户端理解 SHA256 和 SHA384,但不理解 MD5,则它通过空格标记 integrity
属性的值,并将 md5-
元数据标记作为垃圾丢弃。然后,客户端确定元数据中最强的哈希值是 SHA384,并将它们的值与接收到的实际数据的 SHA384 哈希值进行比较。