Хеш-функции простыми словами: 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.