Последнее обновление: 25 октября 2018 г.

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

Хэш

Цель алгоритма хеширования - создать безопасный хеш-код; но что такое хеш?

Хеш - это значение, вычисленное из базового входного числа с помощью хеш-функции.

Вкратце, хеш-значение - это сводка исходных данных. Например, представьте бумажный документ, который вы сжимаете и сжимаете так, что в конце концов вы даже не сможете прочитать его содержимое. Практически (теоретически) невозможно восстановить исходный ввод, не зная, каковы были исходные данные.

Возьмем пример алгоритма хеширования:

Мы могли бы обсудить, безопасен ли это алгоритм. Мы можем вам помочь - это не так. Конечно, каждый входной номер индивидуален (мы поговорим об этом подробнее в следующих разделах), но несложно догадаться, как это работает. Но это просто показывает идею.

Подробнее о хешах - Википедия, webopedia.com

Алгоритм хеширования

Алгоритм хеширования - это криптографическая хеш-функция. Это математический алгоритм, который преобразует данные произвольного размера в хэш фиксированного размера. Он задуман как односторонняя функция, которую невозможно инвертировать. Однако в настоящее время несколько алгоритмов хеширования находятся под угрозой. Это случилось, например, с MD5 - широко известной хэш-функцией, разработанной как криптографическая хеш-функция, которую теперь так легко отменить, - которую мы могли использовать только для проверки данных на предмет случайного повреждения.

Легко понять, какой должна быть идеальная криптографическая хеш-функция:

  1. Вычисление хеш-значения для любого типа данных должно быть быстрым.
  2. Должно быть невозможно регенерировать сообщение по его хэш-значению (атака грубой силой как единственный вариант)
  3. Следует избегать коллизий хешей, у каждого сообщения свой хеш.
  4. Каждое изменение сообщения, даже самое маленькое, должно изменять хеш-значение. Он должен быть совсем другим. Это называется лавинный эффект.

Даже самое маленькое изменение (одна буква) делает весь хеш другим (пример SHA-1)

Для чего мы это используем?

Криптографические хеш-функции широко используются в ИТ. Мы можем использовать их для цифровых подписей, кодов аутентификации сообщений (MAC) и других форм аутентификации. Мы также можем использовать их для индексации данных в хэш-таблицах, для снятия отпечатков пальцев, идентификации файлов, обнаружения дубликатов или в качестве контрольных сумм (мы можем определить, не было ли в отправленном файле случайного или преднамеренного повреждения данных). Мы покажем вам пример последней функции.

Как работают MAC?
Определение кода аутентификации сообщения (MAC)
Coursera
Массачусетский университет

Цифровая подпись
Определение цифровой подписи
Видео YouTube - Безопасность + цифровые подписи

Хеш-таблицы
Хеш-таблицы по CS50

Пример

Итак, как это работает? Вернемся к нашему примеру. Мы отправляем файл нашему другу. Это действительно важный файл, и мы хотим убедиться, что он был доставлен в целости и сохранности. Вот тогда-то и вступает наш алгоритм хеширования. Но сначала давайте подумаем, как бы наша передача файлов выглядела без него:

Мы можем придумать несколько тривиальных идей. Вы можете, например, вызвать User2 и вместе проверить содержимое файла. Но тогда какой смысл отправлять файл? Контрольные суммы здесь наша находка.

Перед отправкой файла User1 использует алгоритм хеширования для генерации контрольной суммы для файла. Затем он отправляет его вместе с самим файлом. Пользователь2 получает и файл, и контрольную сумму. Теперь он / она может использовать тот же алгоритм хеширования для полученного файла. В чем смысл? Мы уже знаем, что хэш индивидуален (поэтому не может быть другого файла с таким же хешем) и должен быть всегда одинаковым для отдельного файла. Независимо от того, сколько раз вы используете алгоритм, он всегда будет давать один и тот же результат. Итак, теперь User2 может сравнивать оба хэша. Если они одинаковые, это означает, что они созданы из одного и того же файла. Невозможно, чтобы какой-либо другой файл имел такой же хеш, и не может быть другого хеша для одного и того же файла.

Таким образом, User2 может проверить, не поврежден ли файл каким-либо образом. Легкий? Конечно.

Многие службы загрузки используют контрольные суммы для проверки целостности своих файлов. Благодаря этому вы можете узнать, не поврежден ли загруженный файл.

Популярные алгоритмы хеширования

MD5

Прежде чем идти дальше - MD5 полностью сломан!

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

Мы уже знаем, что алгоритм безопасного хеширования не может допускать коллизий, а в MD5 довольно легко манипулировать документом, внедряя вредоносный код, получая при этом тот же хэш! Одна из причин, которая убила его, - это его популярность. Его использовали так часто, что лучшим инструментом для взлома хешей MD5 сейчас является… Google. Набрав хеш в поле поиска, вы получите его исходное состояние в течение миллисекунд!

Теперь давайте посмотрим на этот пример:

Вы можете подумать, что вы в безопасности, если ваши пароли хранятся в виде хэшей MD5, но если кто-то получит доступ к вашей базе данных, он / она может просто ввести хеш в Google и получить его реальную ценность! Если вы хотите узнать больше о хешировании паролей и его безопасности, прочтите нашу предыдущую статью Как безопасно хранить пароли.

Институт программной инженерии CMU считает MD5 по существу «криптографически взломанным и непригодным для дальнейшего использования». Он был принят на протяжении многих лет, но сейчас в основном используется для проверки данных на предмет случайного повреждения.

SHA-семья

Secure Hash Algorithm - это криптографическая хеш-функция, разработанная АНБ США. SHA-0 (опубликован в 1993 г.) был взломан много лет назад. SHA-1 (1995) выдает 160-битное (20-байтовое) значение хеш-функции. Обычно оно отображается как шестнадцатеричное число из 40 цифр. Он был скомпрометирован в 2005 году, так как были обнаружены теоретические коллизии, но настоящая смерть наступила в 2010 году, когда многие организации начали рекомендовать его замену.

Большая тройка - Microsoft, Google и Mozilla - перестали принимать SSL-сертификаты SHA-1 в своих браузерах в 2017 году после нескольких успешных атак. SHA-1 был построен на принципах, аналогичных тем, которые использовались в конструкции MD4 и MD5. Однако у него более консервативный подход.

Узнайте больше о несовершенном SHA-1 здесь.

На данный момент безопаснее SHA-2. SHA-2 включает несколько важных изменений. Его семейство имеет шесть хеш-функций с дайджестами: SHA-224, SHA-256 или 512 бит: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.

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

В итоге SHA-2 намного сложнее и по-прежнему считается безопасным. Однако SHA-2 имеет ту же структуру и математические операции, что и его предшественник (SHA-1), поэтому вполне вероятно, что он будет взломан в ближайшем будущем. Таким образом, в будущем появится новая возможность - SHA-3.

SHA-3 (алгоритм безопасного хеширования 3), разработанный Гвидо Бертони, Джоан Дэемен, Микаэль Петерс и Жиль Ван Аше. Их алгоритм Keccak выиграл конкурс NIST в 2009 году и был принят в качестве официального алгоритма SHA. Он был выпущен NIST 5 августа 2015 года. Одним из требований SHA-3 было обеспечение устойчивости к потенциальным атакам, которые могут скомпрометировать SHA-2.

Keccak значительно быстрее SHA-2 (от 25% до 80%, в зависимости от реализации). Используется губчатая конструкция. Данные сначала впитываются в губку, а результат выдавливается. При поглощении блоки сообщений объединяются с помощью XOR в подмножество состояния. Затем он трансформируется как один элемент. При сжатии блоки вывода считываются из этого элемента, но чередуются с преобразованиями состояний.

Ключевым аспектом SHA-3 является то, что он был разработан для простой замены SHA-2 в приложениях, которые в настоящее время используют этот вариант. Таким образом, переход от SHA-2 к SHA-3 должен быть проанализирован с точки зрения требуемого уровня безопасности и накладных расходов (рефакторинг / тестирование), которые в значительной степени зависят от структуры и архитектуры приложения.

Авторы SHA-3 предложили дополнительные функции, такие как аутентифицированная система шифрования и древовидная схема хеширования, но они еще не стандартизированы. На данный момент это самый безопасный алгоритм хеширования.

Полезные ссылки

Вывод

Алгоритмы хеширования могут быть очень полезными. Однако ИТ - очень быстрая отрасль, и это также распространяется на алгоритмы хеширования.

MD5, который когда-то считался действительно безопасным, теперь полностью скомпрометирован. Потом был SHA-1, сейчас это небезопасно. То же самое наверняка когда-нибудь случится с SHA-2.

Чтобы поддерживать свои стандарты безопасности, вы всегда должны следовать новейшим технологиям, особенно когда вы используете алгоритмы хеширования для обеспечения безопасности.

Ни в коем случае нельзя сбрасывать со счетов безопасность приложений, так как она может принести пользу или сломать ваш бизнес. Узнайте больше о Целостности кода или начните бесплатную пробную версию Jscrambler.

Первоначально опубликовано на blog.jscrambler.com 18 октября 2016 г. Обновлено 25 октября 2018 г.