Для чего нужен хеш
Криптографическая хеш-функция превращает входные данные любого размера в «отпечаток» фиксированной длины. Одни и те же данные всегда дают один и тот же дайджест, а изменение хотя бы одного бита на входе даёт совершенно другой. Восстановить исходные данные по дайджесту невозможно, а для современных алгоритмов на практике невозможно и найти два разных входа с одинаковым дайджестом.
Поэтому хеши полезны всякий раз, когда нужно понять, идентичны ли две вещи, не сравнивая их байт за байтом:
- Проверка загрузок. Для ISO-образов Linux, прошивок и многих установщиков рядом со ссылкой на скачивание публикуется SHA-256. Если ваш файл даёт то же значение, он дошёл целым.
- Поиск дубликатов. Две фотографии или два документа с одинаковым SHA-256 — это один и тот же файл, как бы они ни назывались.
- Ключи кэша и ETag. Веб-серверы и инструменты сборки хешируют содержимое, чтобы понять, изменилось ли оно.
- Целостность в API. Вебхуки, lock-файлы пакетных менеджеров и атрибуты Subresource Integrity — всё это опирается на дайджесты.
- Отладка. Сравнение хеша, который вычисляет ваш код, с эталонным значением быстро показывает, в чём ошибка — в хешировании или во входных данных.
Пять алгоритмов бок о бок
Инструмент вычисляет все пять сразу, так что вы сможете сверить значение в любом формате, который публикует сайт.
- MD5, 128 бит, 32 шестнадцатеричных символа. Создан в 1991 году. С 2004 года на практике можно создавать коллизии, поэтому его нельзя использовать там, где злоумышленник может подготовить входные данные. Всё ещё распространён для быстрой проверки дубликатов и в устаревших контрольных суммах.
- SHA-1, 160 бит, 40 шестнадцатеричных символов. Признан устаревшим после первой публичной коллизии в 2017 году. Git исторически идентифицировал объекты по SHA-1, поэтому он до сих пор встречается повсюду.
- SHA-256, 256 бит, 64 шестнадцатеричных символа. Текущий стандарт для контрольных сумм, сертификатов, пакетных менеджеров и блокчейнов.
- SHA-384, 384 бита, 96 шестнадцатеричных символов. Усечённый вариант SHA-512, часто используется в TLS и в хешах Subresource Integrity.
- SHA-512, 512 бит, 128 шестнадцатеричных символов. То же семейство, что и SHA-256, но с 64-битными внутренними операциями, благодаря которым на 64-битных процессорах он может работать быстрее SHA-256.
Если есть выбор, публикуйте и проверяйте SHA-256. MD5 и SHA-1 приемлемы только для обнаружения случайных повреждений, а не намеренной подмены.
Как получить совпадающий хеш для текста
Когда ваш дайджест отличается от чужого для «того же самого» текста, входные данные почти никогда на самом деле не совпадают. Что проверить:
- Перевод строки в конце.
echo hello | sha256sumхешируетhelloс последующим переводом строки. Текстовое поле здесь хеширует ровно то, что вы ввели, поэтому результаты различаются, пока вы не добавите новую строку в конце. В командной строке лишнего символа помогает избежатьecho -nилиprintf. - Окончания строк. Windows использует CR LF, Linux и macOS — LF. Вставленный многострочный текст может менять окончания в зависимости от того, откуда он скопирован.
- Кодировка. Перед хешированием текст переводится в UTF-8. Система, которая хеширует байты в Latin-1 или UTF-16, получит другой результат для всего, что выходит за пределы простого ASCII.
- Невидимые символы. Неразрывные пробелы и символы нулевой ширины, скопированные с веб-страниц или из PDF, на экране выглядят точно так же.
- Регистр шестнадцатеричных цифр. Дайджесты показываются в нижнем регистре.
A3F…иa3f…— одно и то же значение; сравнивайте их без учёта регистра.
Хеширование файлов и проверка контрольных сумм
Кнопка «Хеш файла…» читает выбранный файл локально и вычисляет все пять дайджестов по его точным байтам. Имя и дата файла на результат не влияют — только содержимое. Семейство SHA использует встроенную в браузер реализацию Web Crypto; MD5 вычисляется небольшой библиотекой на JavaScript, потому что браузеры его не предоставляют.
Чтобы проверить загрузку, откройте страницу с контрольными суммами у издателя, найдите строку для своего файла и сравните её с соответствующей строкой здесь. Сравнение первых и последних шести-восьми символов — быстрая проверка на здравый смысл; для настоящей безопасности сравнивайте строку целиком. Если значения различаются, скачайте файл заново, прежде чем подозревать подмену: самая вероятная причина — прерванная загрузка.
Перед хешированием файл целиком загружается в память, поэтому очень большие файлы, особенно в несколько гигабайт на телефоне, могут обрабатываться медленно или не обработаться вовсе. Ничего не загружается на сервер.
Чем хеши не являются
Простой хеш — это не способ хранить пароли. MD5 и семейство SHA спроектированы быстрыми, а это позволяет злоумышленникам проверять миллиарды вариантов в секунду против утёкшего дайджеста. Для хранения паролей нужна намеренно медленная функция с солью, например bcrypt, scrypt или Argon2. Если вам просто нужен надёжный секрет, воспользуйтесь генератором паролей.
Хеш — это и не шифрование. Он односторонний: ключа, которым можно вернуть исходные данные, не существует.