Что такое хеш и почему он повсюду в технологиях?
Вы наверняка видели строки вроде этой:
e3b0c44298fc1c149afbf4c8996fb924
27ae41e4649b934ca495991b7852b855
Они появляются при скачивании программ («проверьте хеш SHA-256»), в разговорах о блокчейне, в обсуждениях безопасности паролей и в бесчисленных инструментах разработчиков. Но что такое хеш на самом деле и почему он так важен для современных технологий?
Концепция простым языком
Хеш-функция принимает любой ввод — слово, предложение, целый файл — и создаёт вывод фиксированной длины, называемый хеш-значением (также называемый дайджестом, контрольной суммой или отпечатком). Ключевые свойства:
- Детерминированность. Один и тот же ввод всегда даёт один и тот же вывод.
- Фиксированная длина. Независимо от размера ввода, вывод всегда одного размера.
- Однонаправленность. Нельзя восстановить исходный ввод из хеш-вывода.
- Лавинный эффект. Малейшее изменение во вводе создаёт совершенно другой хеш.
Думайте об этом как об отпечатке пальца для данных. Так же, как ваш отпечаток пальца однозначно идентифицирует вас, но не может быть использован для воссоздания вашего лица, хеш однозначно идентифицирует фрагмент данных, но не может быть использован для воссоздания оригинала.
Простой пример
Вот что хеш-функция SHA-256 делает с двумя очень похожими вводами:
| Ввод | Хеш SHA-256 (первые 16 символов) |
|---|---|
| "Hello" | 185f8db32271fe25... |
| "hello" | 2cf24dba5fb0a30e... |
| "hello!" | ce06092fb948d9ff... |
Изменение одного символа (заглавная H на строчную h) или добавление восклицательного знака создаёт совершенно другой хеш. Нет никакого шаблона, никакой предсказуемой зависимости. Это лавинный эффект в действии.
Знаете ли вы? Хеш SHA-256 от пустого ввода (буквально ничего) — это e3b0c44298fc1c14.... Это хорошо известная константа. Каждая реализация SHA-256 в мире выдаёт этот точный результат для пустого ввода.
Распространённые алгоритмы хеширования
MD5
- Вывод: 128 бит (32 шестнадцатеричных символа)
- Статус: Взломан для целей безопасности. Коллизии (разные вводы, дающие одинаковый хеш) могут быть сгенерированы за секунды.
- Всё ещё используется для: Проверки целостности файлов, когда безопасность не критична (например, проверка, что скачивание не повреждено).
SHA-1
- Вывод: 160 бит (40 шестнадцатеричных символов)
- Статус: Устарел для безопасности. Коллизии были продемонстрированы.
- Всё ещё используется для: Устаревших систем, идентификаторов коммитов Git.
SHA-256
- Вывод: 256 бит (64 шестнадцатеричных символа)
- Статус: Текущий стандарт. Нет известных практических атак.
- Используется для: Хранения паролей, цифровых подписей, блокчейна, проверки файлов, TLS-сертификатов.
SHA-512
- Вывод: 512 бит (128 шестнадцатеричных символов)
- Статус: Текущий стандарт. Ещё больший запас безопасности, чем SHA-256.
- Используется для: Приложений с высокими требованиями к безопасности, некоторых схем хеширования паролей.
Предупреждение MD5 и SHA-1 никогда не должны использоваться в целях безопасности (пароли, цифровые подписи, сертификаты). Они криптографически взломаны. Используйте SHA-256 или SHA-512 для всего, что связано с безопасностью.
Где используются хеши
Хранение паролей
Когда вы создаёте аккаунт, сайт не хранит (или не должен хранить) ваш настоящий пароль. Вместо этого он хранит хеш вашего пароля. При входе система хеширует введённый вами пароль и сравнивает его с сохранённым хешем. Если они совпадают — вы вошли.
Это означает, что даже при утечке базы данных злоумышленники получают хеши, а не пароли. Они не могут обратить хеш, чтобы найти ваш пароль (хотя могут попытаться угадать его, хешируя распространённые пароли и сравнивая).
Современное хеширование паролей идёт ещё дальше с алгоритмами вроде bcrypt, scrypt и Argon2, которые добавляют соль (случайные данные) и специально работают медленно, чтобы сделать подбор непрактичным.
Проверка файлов
Когда вы скачиваете программу, сайт часто предоставляет хеш SHA-256 файла. После скачивания вы хешируете файл самостоятельно и сравниваете. Если хеши совпадают — файл именно тот, который имел в виду издатель. Если различаются — файл был повреждён или изменён при скачивании.
Ожидаемый: a1b2c3d4e5f6...
Ваш файл: a1b2c3d4e5f6... ✓ Совпадение — файл подлинный
Блокчейн и криптовалюта
Каждый блок в блокчейне содержит хеш предыдущего блока, создавая неразрывную цепочку. Если кто-то попытается изменить прошлую транзакцию, хеш этого блока изменится, что разрушит цепочку начиная с этой точки, делая подделку немедленно обнаруживаемой.
Майнинг биткоина — это, по сути, соревнование в поиске ввода, который создаёт хеш SHA-256, начинающийся с определённого количества нулей.
Цифровые подписи
Когда вы подписываете документ цифровой подписью, вы на самом деле не шифруете весь документ своим закрытым ключом. Вместо этого документ хешируется, и шифруется именно хеш. Это значительно быстрее и создаёт компактную подпись.
Дедупликация данных
Облачные хранилища используют хеши для обнаружения дублирующихся файлов. Если два пользователя загружают один и тот же файл, он имеет одинаковый хеш, и сервису нужно хранить только одну копию.
Контроль версий Git
Каждый коммит, файл и дерево в Git идентифицируются своим хешем SHA-1. Именно так Git определяет, изменился ли файл, и отслеживает всю историю проекта.
Знаете ли вы? Git постепенно переходит с SHA-1 на SHA-256. Переход начался после того, как в 2017 году были продемонстрированы коллизии SHA-1, что теоретически позволяло создать два различных коммита с одинаковым идентификатором.
Проблема необратимости (и почему это важно)
Однонаправленная природа хешей — это одновременно их главная сила и частый источник путаницы.
Нельзя «расшифровать» хеш. Хеш — это не шифрование. Шифрование двустороннее: зашифровать ключом, расшифровать ключом. Хеширование одностороннее: вы можете вычислить хеш из ввода, но не можете вычислить ввод из хеша.
Единственный способ «обратить» хеш — угадать исходный ввод, хешировать вашу догадку и проверить, совпадает ли она. Для коротких простых вводов (вроде распространённых паролей) это выполнимо. Для длинных случайных вводов это вычислительно невозможно.
Вот почему длина пароля так важна. Хеш от «password123» можно найти, перебирая распространённые пароли. Хеш от «j8#kL9$mN2@pQ5&» потребовал бы для нахождения подбором времени, превышающего возраст Вселенной.
Попробуйте сами
Лучший способ понять хеши — поэкспериментировать. Хешируйте слово, затем измените один символ и посмотрите, как полностью меняется вывод. Хешируйте файл до и после модификации и увидите разницу.
Совет Генерируйте и проверяйте хеши для любого текста или файла: Как генерировать и проверять хеши. Попробуйте SHA-256, MD5, SHA-512 и другие — мгновенно, бесплатно, в вашем браузере.
Исследуйте хеши на практике:
Бесплатно, мгновенно, без регистрации.