Что такое функция хэширования?
Функция хэширования превращает любое содержимое — фразу, программу, резервную копию в несколько гигабайт — в строку фиксированной длины, называемую отпечатком или дайджестом. Три свойства её определяют: выход всегда одного размера независимо от входа, одно и то же содержимое всегда даёт один и тот же отпечаток, а подобрать вход по отпечатку практически невозможно. Именно этот третий пункт отличает криптографический хэш от контрольной суммы вроде CRC32.
Практически всё сводится к двум применениям. Проверка целостности : издатель публикует отпечаток своего файла, вы пересчитываете его — совпадение доказывает, что скачивание не искажено. Сравнение содержимого : вместо самих документов хранят их отпечатки — совпадающие отпечатки означают совпадение содержимого, ничего не раскрывая о его природе.
Какой алгоритм выбрать сегодня?
SHA-256 — ответ по умолчанию: стандартизован NSA, затем принят повсеместно, реализован в каждом языке и не имеет известных коллизий. SHA-512 подходит для больших объёмов на 64-битном процессоре и на такой архитектуре часто быстрее собрата. SHA-384 не даёт ничего особенного сверх более длинного варианта. Для подписи сообщения с ключом HMAC-SHA-256 становится эталоном: он объединяет секретный ключ и хэш, поэтому только обладатель ключа может получить то же значение.
А MD5 и SHA-1 остаются полезными для проверок без секретности — индекс, кэш, поиск дубликатов, — где скорость важнее устойчивости. А CRC32, в свою очередь, не является криптографическим хэшом: он обнаруживает случайные изменения, но намеренное искажение создаётся за несколько секунд.
Почему MD5 и SHA-1 считаются взломанными?
Потому что исследователи создали для каждого из них два разных документа с одинаковым отпечатком. Для MD5 эта демонстрация относится к 2004 году, а для SHA-1 реальная коллизия получена в 2017 году под названием SHAttered. Одной коллизии достаточно, чтобы взломать подпись: если атакующий выбирает документ, а издатель лишь хэширует его, тот может подписать иное содержимое. Именно поэтому сертификаты TLS, обновления программ и подписи пакетов отказались от этих алгоритмов.
Чего хэш не делает
Хэшировать — не значит шифровать: отпечаток необратим по замыслу, но он не защищает содержимое, делая его нечитаемым. Хэш ничего не шифрует, не заменяет ни TLS, ни ключ шифрования и не защищает и один пароль — это работа для bcrypt, scrypt или Argon2, созданных быть медленными. Впрочем, двойное хэширование ничего не усиливает: цепочка алгоритмов лишь добавляет хрупкий слой там, где достаточно одной не взломанной функции.
Рекомендуется для
системных администраторов и директоров по ИТ, проверяющих контрольные суммы дистрибутивов; разработчиков, подписывающих артефакты или аутентифицирующих вебхуки; аудиторов и специалистов по комплаенсу, контролирующих целостность резервных копий; журналистов и аналитиков, сравнивающих документы без их передачи; студентов, изучающих понятия отпечатка, коллизии и соли, — и всех, кто хочет вычислить хэш содержимого быстро и без следа, дополнением к которому служат генератор паролей, кодировщик и декодировщик Base64, декодировщик JWT, тестер регулярных выражений и счётчик символов.