最佳SRI哈希大小是多少



我最近发现了以下漂亮的小站点,用于为外部加载的资源生成子资源完整性(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. 浏览器是否会尝试先匹配最长的哈希,因为它更安全,还是先匹配最短的哈希,由于它更快
  2. 人们真的会期望一个哈希匹配,而不是全部三个(除了开发人员错误键入哈希的琐碎情况)吗
  3. 提供所有三个散列而不是只提供一个散列有什么好处吗
  4. 类似于#1,如果你只提供一个散列值,你应该使用哪个?我通常看到站点(例如Bootstrap)在其示例代码中提供sha384值。这是因为它就在中间,不是太大,也不是太小
  5. 出于好奇,integrity属性可以用于<script><link>之外的任何标签吗。我特别想知道<img><source>等多媒体标签
  1. 浏览器是否会尝试先匹配最长的哈希,因为它更安全,还是先匹配最短的哈希,由于它更快

Perhttps://w3c.github.io/webappsec-subresource-integrity/#agility,"用户代理将选择列表中最强的哈希函数">

  1. 人们真的会期望一个哈希匹配而不是全部三个吗

否。但就浏览器行为而言:如果最强的哈希匹配,浏览器就会使用它,并忽略其余的哈希(所以其他哈希是否匹配也无关紧要)。

  1. 提供所有三个哈希而不是仅提供一个哈希有什么好处吗

实践中没有当前收益。这是因为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. 类似于#1,如果你只提供一个哈希值,你应该使用哪个

SHA-512值。

我通常看到站点(例如Bootstrap)在其示例代码中提供sha384值。这是因为它就在中间,不是太大,也不是太小?

我不知道他们为什么选择这样做。但是,由于浏览器需要支持SHA-512哈希,因此指定SHA-384哈希不会带来任何好处——事实上,您只是失去了拥有最强哈希函数的价值。

  1. 出于好奇,integrity属性可以用于<script><link>旁边的任何标签吗

不,不可能——还没有。

我特别想知道<img><source>等多媒体标签。

作为https://w3c.github.io/webappsec-subresource-integrity/#verification-html文档子资源解释说,SRI的计划一直是最终也用于那些——

注意:本规范的未来版本可能包括对所有可能的子资源的完整性支持,即aaudioembediframeimglinkobjectscriptsourcetrackvideo元素。

…但我们还没有进入那个未来。

相关内容

  • 没有找到相关文章

最新更新