Какой самый лучший размер хеша SRI

Недавно я обнаружил следующий изящный маленький сайт для генерации тегов SubResource Integrity (SRI) для внешних загруженных ресурсов. Например, введя последний URL-адрес jQuery ( 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 ответ

Решение
  1. Браузеры пытаются сначала сопоставить самый длинный хэш, поскольку он более безопасный, или самый короткий сначала, так как он быстрее?

Согласно https://w3c.github.io/webappsec-subresource-integrity/, "пользовательский агент выберет самую сильную хэш-функцию в списке".

  1. Можно ли ожидать совпадения одного хеша, а не всех трех?

Нет. Но что касается поведения браузера: если самый сильный хеш совпадает, то браузер использует его и просто игнорирует остальные (так что в любом случае не имеет значения, совпадают ли другие или нет).

  1. Есть ли польза от предоставления всех трех хешей вместо одного?

Насколько я вижу, в настоящее время нет никакой пользы на практике. Это связано с тем, что в https://w3c.github.io/webappsec-subresource-integrity/ "Совместимые пользовательские агенты ДОЛЖНЫ поддерживать криптографические хэш-функции SHA-256, SHA-384 и SHA-512".

Поэтому в настоящее время вы можете просто указать хэш SHA-512, и все браузеры, поддерживающие SRI, будут использовать его.

Тем не менее, согласно https://w3c.github.io/webappsec-subresource-integrity/ цель определения нескольких хешей заключается в том, чтобы "обеспечить гибкость перед лицом будущих криптографических открытий... Авторам рекомендуется начать переход на более сильные хеш-функции по мере их появления ".

Другими словами, в какой-то момент в будущем браузеры начнут добавлять поддержку более сильных хеш-функций (основанных на 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>, так далее.

План для SRI всегда заключался в том, чтобы он в конечном итоге использовался и для них. Как объяснено по адресу https://w3c.github.io/webappsec-subresource-integrity/:

Примечание. В будущем пересмотре этой спецификации, вероятно, будет включена поддержка целостности для всех возможных подресурсов, т. Е. a, audio, embed, iframe, img, link, object, script, source, track, а также video элементы.

... но мы еще не в этом будущем.

Другие вопросы по тегам