Отпечаток данных
Хеш-функция берёт на вход данные произвольного размера, от одного слова до многогигабайтного файла, и выдаёт строку фиксированной длины, называемую хешем или дайджестом. Например, SHA-256 всегда даёт 256 бит, то есть 64 шестнадцатеричных символа, независимо от объёма входных данных. Одни и те же данные всегда дают один и тот же хеш, а малейшее изменение, даже одного символа, меняет результат до неузнаваемости. Конкретный алгоритм описан на странице sha-256.
Главное отличие от шифрования: хеширование необратимо. Из хеша нельзя восстановить исходные данные; см. также shifrovanie.
Свойства хорошей криптографической функции
Их принято перечислять три. Стойкость к нахождению прообраза: по хешу практически невозможно подобрать данные, которые его дают. Стойкость ко второму прообразу: для заданных данных невозможно найти другие с таким же хешем. Стойкость к коллизиям: невозможно найти любую пару разных данных с одинаковым хешем. Поскольку входов бесконечно много, а выходов конечное число, коллизии существуют математически, но хорошая функция делает их поиск нереальным. Старые алгоритмы MD5 и SHA-1 утратили стойкость к коллизиям, и для защиты их применять не следует.
Полезно понимать и «лавинный эффект»: изменение одного бита входа меняет примерно половину бит результата. Поэтому по двум близким хешам нельзя судить о близости исходных данных, и подбор идёт не постепенным приближением, а только полным перебором вариантов.
Хеши паролей
Сервисы не должны хранить пароли открытым текстом, они хранят хеши: при входе введённый пароль хешируют и сравнивают. Но обычной быстрой функции для этого мало: её можно очень быстро перебирать. Для паролей применяют специальные медленные функции с настраиваемой нагрузкой, например bcrypt, scrypt, Argon2, и добавляют к каждому паролю случайную соль, чтобы одинаковые пароли давали разные хеши и не работали заготовленные таблицы. Стойкость по-прежнему зависит от самого пароля: слабый пароль подбирается даже при хорошем хешировании; об этом entropiya-parolya. Утечки баз с хешами рассмотрены на странице utechka-dannyh.
Другие применения
Проверка целостности: рядом с загружаемым файлом публикуют его хеш, и вы сравниваете значение со своим вычисленным. Электронная подпись подписывает не весь документ, а его хеш: см. elektronnaya-podpis. Сертификаты, блокчейны, системы контроля версий и дедупликация данных используют хеши как идентификаторы. Хеш-таблицы в программировании применяют быстрые функции без криптографической стойкости. Коды аутентификации сообщений (HMAC) сочетают хеш с секретным ключом и защищают от подделки данных.
Как вычислить у себя и что учитывать
В Linux и macOS команды sha256sum и shasum -a 256 выведут хеш файла. В Windows подойдёт PowerShell: Get-FileHash путь_к_файлу, по умолчанию с SHA-256. Сравнивайте хеш целиком, а не первые символы. Помните ограничение: совпадение хеша подтверждает, что файл не изменился по сравнению с образцом, но сам образец должен быть получен из надёжного источника. Если хеш и файл лежат на одном скомпрометированном сервере, проверка бесполезна.
Хеши в повседневных задачах и типичные ошибки
Хеши встречаются в разных местах: отпечатки сертификатов, идентификаторы коммитов в системах контроля версий, контрольные суммы образов дисков, ссылки на файлы в системах хранения. Во всех случаях хеш служит компактным идентификатором содержимого.
Типичные ошибки: использовать быстрый хеш вроде SHA-256 без соли и без замедления для хранения паролей, сравнивать хеши обычным сравнением строк в критичном коде, где стоит применять сравнение за постоянное время, доверять MD5 для проверки подлинности, а не только случайных повреждений. Ещё одна ошибка: считать, что хеш скрывает короткие или предсказуемые данные. Хеш номера телефона восстанавливается простым перебором всех возможных номеров, так что «обезличивание» хешем без соли не обеспечивает приватности.
Поэтому для обезличивания данных применяют соль, ключевые хеши либо вовсе удаляют чувствительные значения, а не полагаются на одну лишь необратимость функции.