如何在HTML中加密验证网页的要求?
例如,如果我有一些外部资源,如图像、样式表或(最重要的是)(可能不受信任的)内容交付网络上的脚本,是否可以强制客户端浏览器在使用前以加密方式验证下载资源的哈希?是否有一些HTML属性或URL方案,或者必须手动编写一些JavaScript才能做到这一点?
其基本原理是,提供通过HTTPS提供的HTML哈希值可以针对受损(或错误)的CDN-s提供额外的防御。
关于 SO 的相关问题:
- CDN 用于交付 jQuery 的安全性如何?
截至 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 哈希进行比较。