什么是最佳的SRI哈希大小?

10

最近我发现了一个非常好用的网站来生成外部加载资源的SubResource Integrity (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个回答

25
  1. 浏览器是否会尝试首先匹配最长的哈希,因为它更安全,还是首先匹配最短的哈希,因为它更快?

根据https://w3c.github.io/webappsec-subresource-integrity/#agility,“用户代理将选择列表中最强的哈希函数”。

  1. 是否真的期望只有一个哈希匹配而不是全部三个哈希都匹配?

不是。但就浏览器的行为而言:如果最强的哈希匹配,浏览器将使用该哈希并忽略其余的(所以无论其他哈希是否匹配都没有关系)。

  1. 提供所有三个哈希而不仅仅是一个哈希是否有任何好处?

目前实践中没有任何好处。这是因为根据https://w3c.github.io/webappsec-subresource-integrity/#hash-functions,“符合要求的用户代理必须支持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(或其他类型)哈希函数的新浏览器进行开发。
所以在这种情况下,您需要在完整性值中指定多个哈希值。
类似于#1,如果您只提供一个哈希值,应该使用哪个?使用SHA-512值。
我通常看到的站点(例如Bootstrap)在其示例代码中提供sha384值。这是因为它位于中间位置,既不太大也不太小吗?
我不知道为什么他们选择以那种方式进行。但是,由于浏览器需要支持SHA-512哈希,因此指定SHA-384哈希不会获得任何好处,实际上您只会失去具有最强哈希函数的价值。
出于好奇,integrity属性除了<script><link>标签外,还可以用于任何其他标签吗?
不行,目前还不能。
我特别想知道像<img><source>等多媒体标签是否可以使用。
正如https://w3c.github.io/webappsec-subresource-integrity/#verification-of-html-document-subresources所解释的那样,计划始终是让SRI最终也用于这些标签-
注意:该规范的未来修订很可能包括对所有可能的子资源(即aaudioembediframeimglinkobjectscriptsourcetrackvideo元素)提供完整性支持。
但我们现在还没有到那个未来。

1
哇,太棒了!感谢您抽出时间回答每个问题。我总是忘记检查规格,即使我这样做,我也找不到我要找的东西,所以我很感激提供的链接 :) 我现在要将所有我的sha-384升级为sha-512! - Rabadash8820

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接