Три слова, постоянно путаемые

«Этот пароль зашифрован?» «Просто захешируй URL.» «Данные закодированы, значит, они защищены.» Эти фразы повсюду, и в большинстве из них употреблено не то слово. Хеширование, шифрование и кодирование — три различные операции с тремя разными целями, и их путаница ведёт к реальным ошибкам безопасности, например к хранению паролей методом, который ничего не защищает.

Хорошая новость: два простых вопроса полностью их разделяют.

Два вопроса

  1. Обратима ли она? Можно ли вернуть исходный вход из выхода?
  2. Нужен ли ключ? Требуется ли секрет, или операцию может выполнить кто угодно?

Нанесите три операции на эти вопросы, и картина проясняется:

  • Кодирование обратимо и не нуждается в ключе.
  • Хеширование необратимо и не нуждается в ключе.
  • Шифрование обратимо и нуждается в ключе.

Эта таблица — вся статья. Остальное — детали.

Кодирование: обратимо, без ключа

Кодирование переписывает данные в другое представление, чтобы они могли пройти через канал, ожидающий определённого формата. Base64 превращает байты в безопасный текст; URL-кодирование экранирует символы, недопустимые в URL; UTF-8 превращает символы в байты. Ничто из этого не секретно. Кто угодно может декодировать это обратно, ведь обратимость — весь смысл. Кодирование даёт нулевую защиту. Если вы слышите «токен закодирован, значит, он безопасен», это тревожный сигнал: закодировано значит читаемо.

Хеширование: необратимо, без ключа

Хеш-функция отображает любой вход в дайджест фиксированного размера, и нельзя прокрутить её назад, чтобы восстановить вход. Ей не нужен ключ, так что кто угодно может вычислить тот же дайджест из того же входа. Это делает её идеальной для проверки: контроля целостности, адресации по содержимому и обнаружения изменений. Это правильный инструмент, когда нужно подтвердить, что две вещи одинаковы, не храня оригинал, но она ничего не скрывает обратимо, потому что нечего обращать.

Шифрование: обратимо, с ключом

Шифрование преобразует данные так, что только владелец правильного ключа может преобразовать их обратно. Это единственная из трёх, созданная для секретности. Она обратима по замыслу, но только с ключом, что и есть та самая свойство, которого нет у двух других: кодирование обратимо кем угодно, хеширование — никем, шифрование — владельцами ключа.

Выбор правильного

Цель определяет инструмент. Нужно, чтобы данные пережили транспорт как текст? Закодируйте их. Нужно проверить целостность или сравнить без хранения оригинала? Захешируйте их. Нужно сохранить данные в тайне от всякого без ключа? Зашифруйте их.

Классическая ошибка — потянуться не к тому столбцу. Хранить пароли простым кодированием (обратимым кем угодно) или даже простым шифрованием (один украденный ключ раскрывает всё) намного слабее, чем специально созданный хеш паролей, рассматриваемый в отдельной статье. Инструмент хеширования и инструмент Base64 позволяют наблюдать, как хеширование и кодирование ведут себя по-разному на одном входе, дайджест никогда не обращается, Base64 всегда.