Какой самый лучший размер хеша 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, если вы предоставите только одно хеш-значение, что вы должны использовать? Обычно я вижу сайты (например, Bootstrap), предоставляющие значения sha384 в своем примере кода. Это потому, что он прямо посередине, не слишком большой и не слишком маленький?
- Из любопытства, может
integrity
атрибут будет использоваться на любых тегах, кроме<script>
а также<link>
, Меня особенно интересуют теги мультимедиа, такие как<img>
,<source>
, так далее.
1 ответ
- Браузеры пытаются сначала сопоставить самый длинный хэш, поскольку он более безопасный, или самый короткий сначала, так как он быстрее?
Согласно https://w3c.github.io/webappsec-subresource-integrity/, "пользовательский агент выберет самую сильную хэш-функцию в списке".
- Можно ли ожидать совпадения одного хеша, а не всех трех?
Нет. Но что касается поведения браузера: если самый сильный хеш совпадает, то браузер использует его и просто игнорирует остальные (так что в любом случае не имеет значения, совпадают ли другие или нет).
- Есть ли польза от предоставления всех трех хешей вместо одного?
Насколько я вижу, в настоящее время нет никакой пользы на практике. Это связано с тем, что в 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, если вы предоставите только одно хеш-значение, что вы должны использовать?
Насколько я понимаю, значение SHA-512.
Обычно я вижу сайты (например, Bootstrap), предоставляющие значения sha384 в своем примере кода. Это потому, что он прямо посередине, не слишком большой и не слишком маленький?
Не знаю, почему они решили сделать это таким образом. Но поскольку браузеры обязаны поддерживать хэши SHA-512, вы ничего не получите, указав вместо этого хеш SHA-384 - фактически вы просто теряете значение наличия самой сильной доступной хеш-функции.
- Из любопытства, может
integrity
атрибут будет использоваться на любых тегах, кроме<script>
а также<link>
,
Нет, этого не может быть - пока нет.
Меня особенно интересуют теги мультимедиа, такие как
<img>
,<source>
, так далее.
План для SRI всегда заключался в том, чтобы он в конечном итоге использовался и для них. Как объяснено по адресу https://w3c.github.io/webappsec-subresource-integrity/:
Примечание. В будущем пересмотре этой спецификации, вероятно, будет включена поддержка целостности для всех возможных подресурсов, т. Е.
a
,audio
,embed
,iframe
,img
,link
,object
,script
,source
,track
, а такжеvideo
элементы.
... но мы еще не в этом будущем.