我最近发现了以下漂亮的小站点,用于为外部加载的资源生成子资源完整性(SRI)标记。例如,输入最新的jQuery URL(https://code.jquery.com/jquery-3.3.1.min.js),得到以下<script>
标签:
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8= sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT sha512-+NqPlbbtM1QqiK8ZAo4Yrj2c4lNQoGv8P79DPtKzj++l5jnN39rHA/xsqn8zE9l0uSoxaCdrOgFs6yjyfbBxSg==" crossorigin="anonymous"></script>
我理解SRI散列的目的,我知道它们可以使用不同的散列大小(256位、384位或512位),但我以前从未见过像这样同时使用这三种散列。在MDN文档中,我发现
完整性值可能包含多个由空格分隔的哈希。如果资源与其中一个哈希匹配,则会加载该资源。
但这种匹配究竟是如何执行的?在一篇SO文章中回答多个问题的时间。。。
- 浏览器是否会尝试先匹配最长的哈希,因为它更安全,还是先匹配最短的哈希,由于它更快
- 人们真的会期望一个哈希匹配,而不是全部三个(除了开发人员错误键入哈希的琐碎情况)吗
- 提供所有三个散列而不是只提供一个散列有什么好处吗
- 类似于#1,如果你只提供一个散列值,你应该使用哪个?我通常看到站点(例如Bootstrap)在其示例代码中提供sha384值。这是因为它就在中间,不是太大,也不是太小
- 出于好奇,
integrity
属性可以用于<script>
和<link>
之外的任何标签吗。我特别想知道<img>
、<source>
等多媒体标签
- 浏览器是否会尝试先匹配最长的哈希,因为它更安全,还是先匹配最短的哈希,由于它更快
Perhttps://w3c.github.io/webappsec-subresource-integrity/#agility,"用户代理将选择列表中最强的哈希函数">。
- 人们真的会期望一个哈希匹配而不是全部三个吗
否。但就浏览器行为而言:如果最强的哈希匹配,浏览器就会使用它,并忽略其余的哈希(所以其他哈希是否匹配也无关紧要)。
- 提供所有三个哈希而不是仅提供一个哈希有什么好处吗
实践中没有当前收益。这是因为https://w3c.github.io/webappsec-subresource-integrity/#hash-函数,"一致用户代理必须支持SHA-256、SHA-384和SHA-512加密哈希函数">。
所以当前,如果您只指定一个SHA-512哈希,所有支持SRI的浏览器都会使用它。
但是每个https://w3c.github.io/webappsec-subresource-integrity/#agility指定多个散列的目的是"在未来的加密发现面前提供灵活性……鼓励作者在散列函数可用时开始迁移到更强的散列函数"。
换句话说,在未来的某个时刻,浏览器将开始添加对更强散列函数(基于SHA-3的散列函数)的支持https://en.wikipedia.org/wiki/SHA-3或其它)。
因此,由于您需要继续针对较旧的浏览器和较新的浏览器,因此在一段时间内,您将针对一些SHA-512是最强哈希函数的浏览器,同时也针对当时出现的新浏览器,这些浏览器将增加对一些SHA-3(或其他)哈希函数的支持。
因此,在这种情况下,您需要在integrity
值中指定多个散列。
- 类似于#1,如果你只提供一个哈希值,你应该使用哪个
SHA-512值。
我通常看到站点(例如Bootstrap)在其示例代码中提供sha384值。这是因为它就在中间,不是太大,也不是太小?
我不知道他们为什么选择这样做。但是,由于浏览器需要支持SHA-512哈希,因此指定SHA-384哈希不会带来任何好处——事实上,您只是失去了拥有最强哈希函数的价值。
- 出于好奇,
integrity
属性可以用于<script>
和<link>
旁边的任何标签吗
不,不可能——还没有。
我特别想知道
<img>
、<source>
等多媒体标签。
作为https://w3c.github.io/webappsec-subresource-integrity/#verification-html文档子资源解释说,SRI的计划一直是最终也用于那些——
注意:本规范的未来版本可能包括对所有可能的子资源的完整性支持,即
a
、audio
、embed
、iframe
、img
、link
、object
、script
、source
、track
和video
元素。
…但我们还没有进入那个未来。