Ключевой вопрос: можно ли вернуть исходные данные
Шифрование обратимо. Данные превращаются в шифртекст с помощью алгоритма и ключа, а тот, кто владеет нужным ключом, возвращает исходное содержимое. Цель шифрования: сохранить конфиденциальность при хранении или передаче.
Хеширование обратимым не является. Хеш-функция берёт данные любого размера и выдаёт значение фиксированной длины, отпечаток. Восстановить исходные данные из отпечатка нельзя, а ключа у обычной хеш-функции нет. Цель хеширования: проверять целостность и сравнивать значения.
Свойства хеш-функции
У хорошей хеш-функции несколько свойств. Одинаковые данные всегда дают одинаковый результат. Малейшее изменение входа заметно меняет отпечаток. Найти два разных входа с одним хешем должно быть практически невозможно, а восстановить вход по хешу тоже.
Эти качества делают хеши удобными для проверки файлов после скачивания: если отпечаток совпал с опубликованным, содержимое не повреждено и не подменено, при условии что сам отпечаток получен из надёжного источника.
Когда что применяют
Шифрование нужно, если данные потом придётся прочитать: сообщения, файлы, резервные копии, диски, соединения с сайтами. Хеширование нужно, если читать исходное значение не требуется, а достаточно сравнить: проверка целостности, хранение паролей, поиск дубликатов, цифровые подписи, где подписывают отпечаток документа.
Часто оба подхода работают вместе. Например, в защищённых протоколах хеши используются для проверки целостности сообщений, а шифры для конфиденциальности.
Полезно помнить и о разнице в ошибке. Потеря ключа при шифровании означает потерю данных, а изменение одного бита в файле при хешировании сразу видно по отпечатку. Поэтому для целостности хеш удобнее, а для секретности нужен шифр.
Типичные заблуждения: Шифрование или хеширование
Распространённая ошибка: говорить «пароль зашифрован в базе», когда на деле он захеширован. Разница существенна: зашифрованный пароль можно расшифровать, если ключ попадёт к злоумышленнику, а правильно захешированный можно только подбирать перебором.
Вторая ошибка: считать любую хеш-функцию подходящей. Для проверки файлов и для хранения паролей нужны разные свойства: у первых важна скорость, у вторых, напротив, намеренная медлительность. Использовать устаревшие функции там, где нужна стойкость, нельзя.
Мини-проверка на понимание
Проверьте себя на нескольких вопросах. Вам нужно передать файл другу так, чтобы никто по дороге его не прочитал. Это шифрование: у друга должен быть способ вернуть исходное содержимое. Вам нужно убедиться, что скачанный установщик не повреждён. Это хеширование: вы сравниваете отпечаток с опубликованным. Вам нужно хранить пароли пользователей сайта. Это хеширование со специальной функцией и солью: исходный пароль знать не нужно.
А теперь неочевидные случаи. Цифровая подпись сочетает оба подхода: от документа берётся хеш, а затем этот хеш обрабатывается закрытым ключом. Поэтому подпись получается короткой и быстрой, независимо от размера документа.
Кодирование, например Base64, не относится ни к шифрованию, ни к хешированию. Это просто другое представление данных, обратимое без ключа, и защиты оно не даёт. Встречая закодированный текст, не считайте его секретным.
Запомните формулу: шифрование защищает тайну и требует ключа, хеширование фиксирует отпечаток и ключа не имеет, кодирование лишь меняет запись. Такое различие снимает большую часть путаницы в терминах, которая встречается даже в технических новостях.
Как не ошибиться
Задайте себе вопрос: нужно ли мне получить исходные данные обратно? Если да, требуется шифрование, и вопрос сводится к защите ключа. Если нет, выбирайте хеширование и подходящую функцию под задачу.
И то и другое не заменяет друг друга. Шифрование не подтверждает, что данные не изменены, если не добавлена проверка целостности, а хеш сам по себе ничего не скрывает: по короткому хешу простого значения его нередко удаётся подобрать.
Кратко для памяти: нужно вернуть данные — шифруйте, нужно только сравнить или проверить целостность — хешируйте. Не путайте эти операции ни в разговоре, ни в проекте, потому что неверный выбор приводит либо к потере возможности прочитать данные, либо к ложному ощущению их защищённости.
Если встретите слова «зашифрованный хеш» или «расшифровать хеш», относитесь к ним настороженно: чаще всего это неточная терминология, а иногда и признак небезопасной схемы, которую стоит проверить.