Русский

Инструменты разработчика · SHA хеш-калькулятор

Атаки с расширением длины: почему SHA-256(секрет + сообщение) не является MAC

· Почему это важно

ша-256 криптография безопасность

Блок состояния SHA-256 расширяется дополнительными байтами для создания действительного хеша.
Оригинальная векторная иллюстрация ToolAcre

Добавление секрета к сообщению и его хеширование выглядит как аутентификация, но структура SHA-256 позволяет злоумышленнику расширить сообщение, не зная секрета. В этом посте описываются атака и исправление.

Самодельная подпись запроса — хеш(секрет + тело) и почему она кажется безопасной

Разработчику необходима аутентификация сообщения, но ему не хватает знаний HMAC, поэтому он объединяет секрет с сообщением и хэширует результат. На первый взгляд этот подход выглядит безопасным: выходные данные представляют собой отпечаток фиксированного размера, который должен измениться, если кто-либо изменит сообщение. Однако SHA-256 имеет архитектурный недостаток, называемый расширением длины, который позволяет злоумышленнику добавлять данные к сообщению и вычислять действительный дайджест, не зная секрета. Хэш-калькулятор ToolAcre SHA вычисляет только простые дайджесты, а не аутентификацию по ключу, поскольку это различие важно для реальной безопасности.

Добавление секрета перед хешированием интуитивно привлекательно, поскольку только владелец секрета может пересчитать хэш. Если сообщение меняется, хэш тоже меняется, поэтому оно выглядит как доказательство подлинности. API может подписывать запросы путем объединения общего секрета и тела запроса, а затем хэширования результата и включения этого хеша в запрос. Сервер получает тело, пересчитывает хэш со своей копией секрета и проверяет, совпадает ли он. Если злоумышленник изменит тело, хэш не будет совпадать — по крайней мере, так думают разработчики.

Меркл-Дамгорд передает свое состояние — окончательный дайджест является внутренним состоянием, поэтому злоумышленник может продолжать хеширование с того места, где вы остановились.

SHA-256 принадлежит к семейству хэш-функций Меркла-Дамгорда. Эти функции обрабатывают входные данные блоками фиксированного размера, объединяя функцию сжатия, которая принимает предыдущее состояние и текущий блок и выводит новое состояние. Функция сжатия — единственный внутри криптографический примитив; стратегия цепочки и схема заполнения обеспечивают всю конструкцию. Итоговый дайджест — это просто конечное состояние, напечатанное в шестнадцатеричном формате. Это не случайно: выходом является внутреннее состояние. Любой, кто видит дайджест, имеет точное состояние, необходимое для продолжения хеширования с этой точки.

Чтобы расширить сообщение, злоумышленник начинает с наблюдаемого дайджеста secret + original_message и рассматривает его как переменную состояния для нового вызова функции сжатия. Они добавляют данные, которые хотят добавить, корректно дополняют их до полной длины нового сообщения и вычисляют дайджест. Когда сервер проверяет этот поддельный дайджест, добавляя свой собственный секрет и хеширование, вычисления продолжаются идентично расчетам злоумышленника после того, как первоначальный секрет был поглощен. Сервер вычисляет тот же дайджест, и поддельное сообщение принимается без знания секрета злоумышленником.

Как работает расширение — добавление дополнений и дополнительных данных для создания действительного хеша для более длинного сообщения

Расширение длины по-разному влияет на разные алгоритмы. SHA-1 уязвим: злоумышленник может просмотреть дайджест SHA-1 и расширить сообщение. SHA-256 уязвим точно так же. SHA-512 также уязвим для атак расширений. SHA-384 не допускает расширения длины, поскольку он создан как SHA-512, усеченный до 384 bits. Вывод функции сжатия длиннее опубликованного дайджеста, поэтому у злоумышленника недостаточно информации для продолжения хеширования. Губчатая конструкция, используемая в SHA-3, также устойчива, поскольку не пропускает внутреннее состояние.

Чтобы понять, какие алгоритмы уязвимы, необходимо знать кое-что о размере функции сжатия и размере опубликованного дайджеста. SHA-256 публикует 256 bits, а состояние функции сжатия также равно 256 bits, поэтому дайджест представляет собой полное состояние. У злоумышленника есть все необходимое для продолжения. SHA-384 публикует 384 bits, но базовое состояние функции сжатия — 512 bits, поскольку SHA-384 построено на основе SHA-512. Дайджест раскрывает только 384 из 512 bits, оставляя 128 bits неизвестным злоумышленнику. Это преднамеренное свойство SHA-384, которое обеспечивает такое сопротивление.

Поддерживаемые конструкции SHA-1, SHA-256 и SHA-512 предоставляют полное состояние; Усечение SHA-384 изменяет границу расширения

Исправлением для аутентификации сообщений с общим секретом является HMAC, код аутентификации сообщения с хеш-ключом. HMAC не добавляет секрет и хэш; вместо этого он применяет секрет в двух вложенных хэш-операциях, используя определенные схемы заполнения, называемые внутренними и внешними заполнениями. Конструкция: HMAC(секрет, сообщение) = SHA256(secret_XOR_outer_pad, SHA256(secret_XOR_inner_pad, message)). Этот вложенный подход закрывает пробел в расширении длины, потому что даже если злоумышленник имеет дайджест внутреннего хеша, он не может продолжать хеширование без секрета.

Причина разделения операций дайджеста и HMAC состоит в том, чтобы избежать распространенной ошибки, когда они рассматриваются как взаимозаменяемые. Разработчик, изучающий хеширование с помощью инструмента, который выполняет и то, и другое, может забыть, какой из них он использует при написании кода. Разделение вычислений дайджеста делает выбор очевидным и укрепляет понимание того, что для аутентификации требуется HMAC или подписи. Хэш-калькулятор ToolAcre SHA четко обозначает простые дайджесты, а в документации объясняется, что HMAC — это совершенно другая операция.

HMAC как исправление — вложенная конструкция, закрывающая пробел, и почему это стандартный ответ

Концептуальный пример расширения длины работает на знакомом тестовом векторе abc. Вычисление SHA-256 для текста ASCII abc дает дайджест ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Предположим, что этот дайджест является результатом операции secret + abc, хешированной с 5-байтовым секретом, что дает в общей сложности 8 bytes входных данных. SHA-256 обрабатывает входные данные блоками по 64 байт, поэтому первый и единственный блок был дополнен длиной сообщения и другими байтами заполнения. Злоумышленник видит дайджест и хочет подделать сообщение, начинающееся с abc, за которым следуют дополнительные данные.

Они не могут напрямую добавлять к abc, поскольку не знают точного заполнения, добавленного в хэш. Однако они могут вычислить, каким должно было быть полное дополненное сообщение: abc плюс необходимое дополнение для ввода 8 байта в блок 64 байт. Затем они добавляют свои дополнительные данные, вычисляют заполнение для новой общей длины и хешируют комбинацию, рассматривая наблюдаемый дайджест как начальное состояние. Результатом является действительный дайджест SHA-256, который примет сервер, поскольку он добавляет секрет и вычисляет тот же хэш.

Рабочий пример — концептуальное описание расширения подписанного сообщения без активной цели.

Чтобы предотвратить эту атаку в реальной системе, разработчику не следует пытаться построить аутентификацию на основе простого хеша. HMAC — это стандартный ответ, а ToolAcre SHA хеш-калькулятор — это инструмент для вычисления простых дайджестов для проверки целостности, хеширования контента и аналогичных целей, не связанных с аутентификацией. Примеры безопасного использования простых дайджестов SHA-256 включают контрольные суммы файлов, когда злоумышленник не может контролировать и файл, и дайджест; хранилище с адресацией по содержимому, где хэш является ключом поиска; и цифровые подписи в сочетании с подписями, где подпись обеспечивает аутентификацию.

Полный объем этой проблемы включает в себя другие алгоритмы, предоставляемые браузером. SHA-1 уязвим к расширению длины и уже был криптографически взломан до того, как это стало актуальным. Калькулятор ToolAcre помечает SHA-1 как устаревший и объясняет коллизионные атаки, которые сделали его непригодным для новых приложений. Для новых приложений SHA-256 является разумным выбором для простых дайджестов, а если требуется аутентификация, ответом будет HMAC с SHA-256. SHA-384 и SHA-512 уязвимы, но SHA-384 защищен усечением.

Чего это не охватывает: калькулятор ToolAcre вычисляет простые дайджесты, а не HMAC; пост объясняет, почему это различие имеет значение

При построении мысленной модели хеш-функций ключевыми понятиями становятся конструкция Меркла-Дамгорда и расширение длины. Хэш-функция должна обрабатывать входные данные произвольной длины и выдавать фиксированный результат. Это достигается путем объединения функций сжатия блок за блоком, и то, как окончательное состояние преобразуется в выходные данные, имеет огромное значение. Если конечное состояние выводится полностью, то этот вывод содержит всю информацию, необходимую для продолжения хеширования. Если конечное состояние усечено, часть скрыта.

Для разработчика, впервые читающего об атаках на расширение длины, возникает вопрос: как узнать, повлияет ли это на их вариант использования? Если входные данные для хеша являются общедоступной константой и хэш используется в качестве ключа поиска или отпечатка пальца, расширение длины не имеет значения. Если хэш используется для аутентификации сообщения, когда обе стороны разделяют секрет, расширение длины является критической уязвимостью, а HMAC — исправлением. Хэш-калькулятор ToolAcre SHA отображает дайджесты и количество байтов, давая понять, что это результаты вычислений, а не механизмы аутентификации.

Вывод: для аутентификации используйте MAC — хеш-калькулятор ToolAcre SHA предназначен для дайджестов целостности; для аутентификации требуется HMAC или подпись

Применяя это к производственным системам, принцип прост: никогда не используйте голый хэш для аутентификации, когда речь идет о секрете. HMAC — стандартная конструкция, полностью закрывающая вектор атаки расширения длины. SHA-256 и SHA-384 безопасны для использования по назначению при правильном использовании. Понимание трех ключевых моментов — что Меркл-Дамгорд раскрывает свое состояние в дайджесте, что SHA-384 усекается, чтобы скрыть часть состояния, и что HMAC использует вложенную конструкцию для предотвращения расширения — дает разработчику инструменты для правильного выбора.

Хэш-калькулятор ToolAcre SHA воплощает это учение: он предоставляет простые дайджесты для обучения и для законного использования без аутентификации, он помечает SHA-1 как устаревший и не реализует HMAC, поскольку эта операция принадлежит другому контексту. Когда разработчики используют простой хеш-калькулятор для аутентификации запроса, позиционирование и документация этого инструмента подсказывают им, что HMAC и подписи являются подходящим инструментом. Набор инструментов ToolAcre фокусируется на том, что напрямую обеспечивает Web Crypto браузера, и объясняет границы, в которых подходит каждый примитив.