Отпечаток данных
Хеш-функция берёт любые входные данные (слово, документ, видео на 4 ГБ) и превращает их в короткую строку фиксированной длины — хеш, дайджест или контрольную сумму. Одни и те же данные всегда дают один и тот же хеш, а малейшее изменение даёт совершенно другой:
| Входные данные | Хеш SHA-256 |
hello | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
Hello | 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 |
hello! | ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b |
Одна заглавная буква или один восклицательный знак меняет каждый символ результата. Попробуйте сами в Генератор хешей.
Какой должна быть хорошая хеш-функция
- Детерминированной: одни и те же данные всегда дают один и тот же хеш на любом компьютере.
- Односторонней: по хешу нельзя восстановить исходные данные.
- Стойкой к коллизиям: должно быть практически невозможно найти два разных входа с одинаковым хешем.
- Быстрой для контрольных сумм — это удобно, и именно поэтому быстрые хеши не годятся для паролей (об этом ниже).
Хеширование — не шифрование
Шифрование двустороннее: с ключом вы получаете исходные данные обратно. У хеша нет ключа, и его нельзя обратить. Он позволяет только проверить совпадение. Base64 — ещё одно, третье: это просто кодировка, и раскодировать её может кто угодно.
Распространённые алгоритмы
| Алгоритм | Длина | Состояние |
| MD5 | 128 бит (32 шестнадцатеричных символа) | Взломан с 2004 года; годится только для обнаружения случайных повреждений |
| SHA-1 | 160 бит (40 шестнадцатеричных символов) | Взломан: первая реальная коллизия опубликована в 2017 году |
| SHA-256 | 256 бит (64 шестнадцатеричных символа) | Безопасен; стандартный выбор сегодня |
| SHA-512 | 512 бит (128 шестнадцатеричных символов) | Безопасен; на 64-битных компьютерах часто быстрее SHA-256 |
Вот слово hello в каждом из них:
- MD5:
5d41402abc4b2a76b9719d911017c592 - SHA-1:
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d - SHA-256:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
Что значит «взломан» для MD5 и SHA-1
Для MD5 и SHA-1 исследователи умеют намеренно создавать два разных файла с одинаковым хешем. Злоумышленник может этим воспользоваться, чтобы подменить безобидный файл вредоносным с совпадающей контрольной суммой или подделать подписанный документ. Ни один из них не взломан в смысле обратимости, а случайное повреждение по-прежнему меняет хеш, поэтому сумма MD5 всё ещё выявит загрузку, оборвавшуюся на полпути. Она лишь не может доказать, что файл никто не подменял.
SHA-256 и SHA-512 относятся к семейству SHA-2, опубликованному в 2001 году, и практических атак на них не известно. SHA-3, стандартизованный в 2015 году, — другая конструкция, которую держат про запас.
Где используются хеши
- Проверка загрузок: разработчики публикуют SHA-256 своих файлов; если ваш совпадает, он идентичен. См. как проверить контрольную сумму.
- Электронные подписи и сертификаты HTTPS: документ или сертификат хешируется, и подписывается хеш.
- Git: каждый коммит и файл определяется своим хешем. Git долго использовал SHA-1 и добавил поддержку SHA-256.
- Биткоин и другие блокчейны: блоки связываются в цепочку с помощью SHA-256.
- Поиск дубликатов: два файла с одинаковым SHA-256 — один и тот же файл.
Хеши и пароли
Сайты никогда не должны хранить ваш пароль — только его хеш; при входе они хешируют введённое и сравнивают. Но SHA-256 тут не подходит: он так быстр, что злоумышленник с утёкшей базой может перебирать миллиарды вариантов в секунду. Паролям нужно медленное хеширование с солью, созданное для этой задачи, например bcrypt, scrypt или Argon2. Соль — случайное значение, добавляемое к каждому паролю перед хешированием, чтобы у двух людей с одинаковым паролем получились разные хеши.
Попробуйте
Генератор хешей вычисляет MD5, SHA-1, SHA-256, SHA-384 и SHA-512 любого текста или файла сразу, в браузере, и может сравнить их с опубликованной контрольной суммой.