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