1

如何以加密方式验证 HTML 中的网页要求?

例如,如果我在(可能不受信任的)内容交付网络上有一些外部资源,如图像、样式表或(最重要的)脚本,是否可以强制客户端浏览器以加密方式验证下载资源的哈希值使用前?是否有一些 HTML 属性或 URL 方案,或者是否必须手动编写一些 JavaScript 才能做到这一点?

基本原理是,在通过 HTTPS 提供的 HTML 中提供散列可以额外防御受损(或故障)CDN-s。

关于 SO 的相关问题:

4

1 回答 1

0

截至 2016 年 6 月 23 日,子资源完整性是 W3C 建议,它允许您这样做(此处的草案版本)。根据实施报告,它已经在 Firefox 43 和 Chrome 45 中实施。

使用子资源完整性的一个简单示例如下:

<script src="https://example.com/example.js"
    integrity="sha256-8OTC92xYkW7CWPJGhRvqCR0U1CR6L8PhhpRGGxgW4Ts="
    crossorigin="anonymous"></script>

还可以在完整性字段中指定多个算法哈希对(称为元数据),由空格分隔并忽略无效数据(§3.3.3)。客户端需要过滤掉最强的元数据值(§3.3.4),并将实际数据的哈希值与最强元数据值集合中的哈希值(§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 散列进行比较。

于 2016-08-16T14:22:58.897 回答