Безопасность

Хеш-функции простыми словами: MD5, SHA-1 или SHA-256 и как их применять

Контрольные суммы загрузок, идентификаторы коммитов Git и адреса в блокчейне — всё это хеш-значения. В руководстве объясняется, чем хеширование отличается от шифрования и какой алгоритм выбрать для каждой задачи.

Что такое хеш-функция

Хеш-функция принимает входные данные любой длины и выдаёт короткое значение фиксированной длины — хеш, или дайджест. Хешируете ли вы одно слово или видео на несколько гигабайт, SHA-256 всегда выдаёт 256 бит, то есть 64 шестнадцатеричных символа.

Главное — хеширование необратимо. Вычислить исходные данные по хешу невозможно. В этом ключевое отличие от шифрования, которое обращается с помощью ключа, и от Base64, который может обратить кто угодно.

Три свойства хорошего хеша

Криптографическая хеш-функция для задач безопасности должна отвечать следующим требованиям.

  • Детерминированность: одни и те же данные всегда дают один и тот же хеш.
  • Лавинный эффект: изменение одного символа полностью меняет результат — сравните hello и hello! в примере ниже.
  • Стойкость к коллизиям: на практике должно быть невозможно найти два разных входа с одинаковым хешем.
SHA-256("hello")  = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("hello!") = ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b
MD5("hello")      = 5d41402abc4b2a76b9719d911017c592

Регистр тоже важен: Hello и hello дают никак не связанные хеши. Прежде чем сравнивать хеши, убедитесь, что входные данные совпадают полностью, включая пробелы, переводы строк и регистр букв.

Сравнение MD5, SHA-1 и SHA-256

MD5 выдаёт дайджест длиной 128 бит (32 шестнадцатеричных символа). Он быстрый, но практические атаки на коллизии известны с 2004 года, поэтому для защиты его использовать нельзя. Как простая контрольная сумма против случайного повреждения он всё ещё годится.

SHA-1 выдаёт 160 бит. В 2017 году исследователи Google и CWI опубликовали два разных PDF-файла с одинаковым хешем SHA-1 (SHAttered), и на применении SHA-1 в безопасности была поставлена точка. Браузеры и удостоверяющие центры больше не доверяют сертификатам SHA-1.

SHA-256 относится к семейству SHA-2 и выдаёт 256 бит. Это стандарт де-факто для контрольных сумм программ, TLS-сертификатов и блокчейнов. Для новых систем выбор по умолчанию — SHA-256 или более стойкий алгоритм.

Проверка файлов по контрольной сумме

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

Если контрольная сумма лежит на том же сервере, что и файл, злоумышленник может заменить и то и другое. Поэтому важные программы подписывают файл с контрольными суммами с помощью GPG или публикуют его по отдельному HTTPS-каналу.

Почему «голый» SHA-256 не подходит для паролей

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

Используйте специальные, намеренно медленные функции: bcrypt, scrypt или Argon2. Они добавляют к каждому паролю уникальную случайную соль, поэтому одинаковые пароли дают разные сохранённые значения, а заранее вычисленные радужные таблицы становятся бесполезны.

Хеш, HMAC или шифрование?

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

  • Проверить, что данные не изменились: хеш SHA-256.
  • Проверить, что сообщение пришло от того, кто знает общий секрет: HMAC-SHA256 (подписи вебхуков и API-запросов).
  • Хранить пароли: bcrypt, scrypt или Argon2.
  • Скрыть данные и прочитать их позже: шифрование, например AES-GCM.

Попробуйте с этими инструментами

Другие руководства

Все руководства