Помимо шифрования, хеширование, пожалуй, является наиболее важным строительным блоком современных криптосистем. Но что такое гашиш? Почему это так важно? Как некоторые способы вычисления хэша могут быть лучше других и что делает конкретный метод подходящим для криптографии?
Что такое хэш?
Хэш - это вывод односторонней функции, которая принимает произвольные входные данные и вычисляет выходные данные предсказуемой длины, которые “описывают” входные данные. Запустите один и тот же ввод через функцию тысячу раз, и вы всегда получите один и тот же результат. Если вы измените хотя бы один бит входных данных, ваш вывод, скорее всего, будет сильно отличаться. Важно отметить, что попытка пойти в другом направлении очень затратна с точки зрения вычислений – учитывая только выходные данные, возврат к входу функции неочевиден и затратен с точки зрения вычислений. Имейте в виду, что существует только так много возможных выходов, которые могут существовать фиксированной длины, но бесконечное число возможных входов. Это означает, что выходные данные алгоритма хеширования не являются уникальными для всех возможных входных данных. На самом деле, для двух входов, которые приводят к одному и тому же выходу, существует специальное название – столкновение.
Для чего мы используем хэши?
Для чего используются хэши? Хэши полезны в нескольких обстоятельствах, как криптографических, так и других. Вы когда-нибудь видели хэш, предоставляемый вместе с загрузкой, доступной на веб-сайте? Распространено заблуждение, что это делается в целях безопасности, но на самом деле эти хэши предоставляются для того, чтобы пользователь мог проверить, что биты, загруженные на сервер, совпадают с битами, загруженными пользователем. Представьте, что вы перепрошиваете образ встроенного ПО на часть сетевого оборудования, в которой не хватает нескольких битов в конце! (По этой причине существуют и другие механизмы, такие как CRC). Кроме того, хэши широко используются наряду с асимметричной криптографией для создания цифровых подписей. Метод, который очень популярен, называется “HMAC” (код аутентификации сообщений на основе хэша). Практика довольно проста: при отправке сообщения возьмите сообщение и запустите его через функцию хэширования, чтобы создать дайджест. Зашифруйте дайджест своим закрытым ключом и добавьте его к исходному сообщению. Получатель, который ранее решил доверять вашему открытому ключу, просто вычисляет свой собственный хэш сообщения, расшифровывает хэш, указанный вами в конце сообщения, используя ваш открытый ключ, и сравнивает его с хэшем, который они вычислили из сообщения. Поскольку только владелец соответствующего закрытого ключа мог совершить этот подвиг, сообщение аутентифицируется!
Что делает хэш подходящим для криптографических целей?
Как мы теперь знаем, столкновения являются частью курса, когда дело доходит до алгоритмов хэширования. Чего не должно быть, так это "предсказуемых столкновений". Атака на столкновение происходит, когда плохой актер пытается вызвать столкновение со злонамеренно измененным входом, который хэширует тот же вывод. Когда клиент отправляется проверять целостность сообщения, он будет считать, что вредоносная полезная нагрузка является исходным сообщением! Как правило, такого рода атаки включают изменение исходного сообщения и игру с дополнениями. Допустим, у нас есть сообщение от одного международного супершпиона другому.
SHA-256
SHA-256 (Алгоритм безопасного хэширования - 256) является детерминированной односторонней хэш-функцией. Это один из членов криптографической хэш-функции SHA-2, которая была разработана АНБ. До сих пор его 256-битный ключ никогда не был скомпрометирован. Ранее SHA-1 был широко используемым алгоритмом хеширования для шифрования. Но со временем SHA-1 постепенно устарел, и он больше не считался безопасным. Итак, был разработан SHA-2.
В 2016 году индустрия SSL-сертификатов перешла на SHA-2, и это стало новым стандартом.
SHA-256, который является членом криптографической хэш-функции SHA-2, никогда не был скомпрометирован. Итак, как же это так безопасно? Мы узнаем об этом через минуту.
Как это работает?
Хэш-функция просто преобразует большой объем информации в меньшее случайное число. Это алгоритм SHA-256, который генерирует меньшее случайное число из большого заданного числа. Но меньшее число всегда будет одинаковым, когда одно и то же большое число передается через функцию хэширования. SHA-256 настолько безопасен, что даже если мы изменим только одну цифру на входе, выход полностью изменится. SHA-256 возвращает шестнадцатеричное представление, 256 бит представляют 64 шестнадцатеричных символа. Независимо от того, какой длины ввод, он всегда будет возвращать шестнадцатеричную строку из 64 символов.
SHA-256 - это детерминированная односторонняя хэш-функция. Это означает, что это математическая функция, которая принимает любой размер входных данных, но возвращает вывод фиксированного размера, например, цифровой отпечаток файла или строки. Это детерминировано, потому что один и тот же вход всегда дает один и тот же результат. Это один из способов, потому что трудно выполнять операции в обратном направлении, то есть возвращать входную строку из вывода.
Вот несколько примеров:
Пример 1
Ввод: здравствуйте
Выход:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
Ввод: Здравствуйте
Выход:
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
Видите ли, независимо от длины, он возвращает строку из 64 символов. И даже заглавная буква одного слова полностью изменяет хэш, и невозможно догадаться, что “здравствуйте” и “Здравствуйте” очень похожи друг на друга, если посмотреть на хэш-функцию.
Теперь вы можете ввести в хэш-функцию любой тип ввода, например изображения, текст, видео любой длины и размера, и она выдаст ровно 64 символа. Таким образом, это похоже на цифровой отпечаток пальца любого файла или строки.
Пример 2
"Встретимся в London Eye в 4 часа дня"
Хэш sha256 этой фразы равен:
c36672122a8e8a8a36880e59ba8e6ca994f2771247ce88731d2486d7775c1233
Тем не менее, взгляните на дайджест SHA-256 строки ниже:
"Встретимся в London Eye в 4 часа дня "
Хэш sha256 этой фразы равен:
90100f64c2a8918ac581ce7f559289483bc543f37c78d77756ae7e85fd30dcf9
Смущены? Второй вариант сообщения содержит пробел в конце! Несмотря на то, что семантически он ничем не отличается, это другая комбинация символов, поэтому в результате получается другой хэш.
С криптографически безопасным алгоритмом хэширования это всегда приводило бы к другому хэшу. С алгоритмом хеширования, уязвимым для предсказуемых атак на столкновение, возможно, если злоумышленник включит только правильную комбинацию семантически не относящихся символов, они смогут создать впечатление, что их измененное сообщение прошло проверку. Представьте, если бы злоумышленник мог сделать это, чтобы выдать себе сертификаты SSL/TLS, которым доверял бы любой браузер в мире!
Какие алгоритмы хэширования безопасны в 2021 году?
В настоящее время золотым стандартом в отрасли является любой хэш из семейства хэшей SHA-2 длиной 256 бит или более. Это включает в себя SHA-256, SHA-384 и SHA-512. Эти алгоритмы хэширования рекомендуются через NIST в FIPS PUB 180-2 (который с тех пор был заменен FIPS PUB 180-4, но сохранил рекомендацию). До недавнего времени SHA-1 считался относительно безопасным, но в течение последних 5 лет появились новые способы использования современного оборудования для предотвращения предсказуемых столкновений. MD5 и MD4 уже более десяти лет не подходят для криптографических целей, но по-прежнему идеально подходят для проверки соответствия битов прошивки вашего маршрутизатора тому, что было загружено!
Из этих рекомендуемых функций хеширования SHA-256 на сегодняшний день наиболее часто реализуется в программном обеспечении. Это связано с тем, что при нынешней вычислительной мощности SHA-256, SHA-384 и SHA-512 одинаково безопасны (злоумышленнику невозможно вычислить конфликты). SHA-384 и SHA-512 являются средством проверки алгоритма в будущем, но в 2021 году очень мало причин для вычисления хэшей, которые занимают больше времени, потребляют больше памяти и потребляют больше заряда батареи.
Вывод
Алгоритмы хэширования здесь надолго. Свойства, которые они предоставляют, бесценны для криптографов и распространены повсюду, где встречается криптография. Хотя нет никакой гарантии, что SHA-256 будет оставаться достаточно безопасным, существуют другие алгоритмы хеширования, в том числе SHA-3, который был доработан в 2015 году, в основном для того, чтобы в случае, если SHA-2 будет сломан аналогично SHA-1, уже существовала потенциальная подходящая замена. В следующий раз, когда вы увидите ссылку на SHA-2 в новостях, попробуйте выяснить, почему в рассматриваемой системе используется хеширование.