2016-04-27 13 views
1

Как криптографически проверять реквизиты веб-страницы в HTML?Как криптографически проверять реквизиты веб-страницы?

Например, если у меня есть внешний ресурс, такой как изображение, таблица стилей или (что наиболее важно) сценарий в сети с потенциально ненадежной доставкой контента, можно ли заставить браузер клиента криптографически проверить хэш загруженного ресурса перед использованием? Есть ли какой-то HTML-атрибут или схема URL для этого или вам нужно вручную написать JavaScript для этого?

Обоснование заключается в том, что предоставление хэшей в HTML, передаваемых через HTTPS, обеспечивает дополнительную защиту от скомпрометированных (или ошибочных) CDN-s.

Похожие вопросы на SO:

+1

Я думаю, что вы ищете это: https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity, но я не использовал его, и он экспериментальный на данный момент. –

+0

@SideriteZackwehdex Это звучит очень интересно. Благодаря! Однако я склонен думать, что схема URI может быть более универсальным решением. – jotik

+1

Не зависит от операционной системы? Или вы имеете в виду http://stackoverflow.com/questions/16055458/install-a-service-handler-for-uri-scheme-from-webpage? –

ответ

0

По состоянию на 23 июня 2016 Subresource Integrity является Рекомендация W3C, которая позволяет делать только что (черновой вариант here). Согласно Implementation Report она уже реализована в Firefox 43 и Chrome 45.

Простой пример использования целостности subresource будет что-то вроде:

<script src="https://example.com/example.js" 
    integrity="sha256-8OTC92xYkW7CWPJGhRvqCR0U1CR6L8PhhpRGGxgW4Ts=" 
    crossorigin="anonymous"></script> 

Также можно указать несколько пар алгоритм-хэш (так называемый метаданные) в поле целостности, разделенные пробелами и игнорирование недопустимых данных (§3.3.3). Ожидается, что клиент отфильтровывает самые сильные значения метаданных (§3.3.4) и сравнивает хэш фактических данных с хэш-значениями в наборе самых сильных значений метаданных (§3.3.5), чтобы определить, действительно ли ресурс. Например:

<script src="https://example.com/example.js" 
    integrity=" 
     md5-kS7IA7LOSeSlQQaNSVq1cA== 
     md5-pfZdWPRbfElkn7w8rizxpw== 
     sha256-8OTC92xYkW7CWPJGhRvqCR0U1CR6L8PhhpRGGxgW4Ts= 
     sha256-gx3NQgFlBqcbJoC6a/OLM/CHTcqDC7zTuJx3lGLzc38= 
     sha384-pp598wskwELsVAzLvb+xViyFeHA4yIV0nB5Aji1i+jZkLNAHX6NR6CLiuKWROc2d 
     sha384-BnYJFwkG74mEUWH4elpCm8d+RFIMDgjWWbAyaXAb8Oo//cHPOeYturyDHF/UcnUB" 
    crossorigin="anonymous"></script> 

Если клиент понимает, SHA256 и SHA384, но не MD5, то он размечает значение атрибута integrity пропусков и отбрасывает md5- маркеров метаданных как мусор. Затем клиент определяет, что самые сильные хэши в метаданных - SHA384 и сравнивает их значения с хэшем SHA384 фактических полученных данных.