Получить доступ

Чем хеширование отличается от шифрования и кодирования?

JuniorБезопасность
Ещё спрашивают так:
  • Base64 — это шифрование?
  • Можно ли расшифровать хеш?
  • Что такое HMAC?
Коротко

Кодирование (Base64, URL-кодирование) — смена формата, обратимо без секрета. Шифрование — обратимо только с ключом. Хеширование — необратимый отпечаток фиксированной длины.

  • Base64 не защищает ничего — это не шифрование
  • Криптографический хеш (SHA-256): нельзя подобрать вход по выходу и найти два входа с одним хешем
  • HMAC — хеш с секретным ключом: проверка, что сообщение не подделано

А ещё Хеш-функция для хеш-таблицы и криптографическая — разные требования

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Кодирование меняет представление данных, чтобы их можно было передать: Base64 превращает байты в печатные символы для JSON, почты и URL; процентное кодирование — для адресов; UTF-8 — для текста. Ключа нет, раскодировать может любой. Пароль в Base64 в конфиге или заголовок Authorization: Basic без HTTPS — это открытый текст.

Шифрование превращает данные в шифротекст, который без ключа прочитать нельзя, а с ключом — можно восстановить исходное. Нужно, когда данные потом понадобятся: передача по сети (TLS), хранение номеров карт и персональных данных, бэкапы. Симметричное (AES) — один ключ, асимметричное (RSA, эллиптические кривые) — пара ключей.

Хеширование превращает вход любой длины в отпечаток фиксированной длины. Обратной операции нет. От криптографического хеша (SHA-256, SHA-3, BLAKE2) требуется:

  • по хешу нельзя найти вход (стойкость к нахождению прообраза);
  • нельзя найти два разных входа с одинаковым хешем (стойкость к коллизиям);
  • малейшее изменение входа полностью меняет хеш (лавинный эффект).

MD5 и SHA-1 для безопасности больше не годятся — коллизии находятся.

Где хеш: проверка целостности файлов (контрольные суммы), git (адресация объектов), цифровая подпись (подписывают хеш), дедупликация, хранение паролей — но специальными медленными функциями.

HMAC — хеш от сообщения вместе с секретным ключом. Проверяет, что сообщение отправил тот, у кого есть ключ, и оно не изменено. Применения: подпись вебхуков (платёжные системы, GitHub), подпись JWT алгоритмом HS256, подпись ссылок. Сравнивать подписи нужно за постоянное время (hmac.compare_digest), иначе можно подобрать по времени ответа.

Не путать с хеш-функцией для хеш-таблицы: там нужна скорость и равномерность, а стойкость к атакам — нет (хотя для защиты от искусственных коллизий Python и Java используют рандомизацию или деревья в корзинах).

Пример

import base64, hashlib, hmac
base64.b64encode(b"secret")               # b'c2VjcmV0' — раскодирует любой
hashlib.sha256(b"secret").hexdigest()     # '2bb80d53…' — обратно не получить
sig = hmac.new(b"webhook-key", b'{"paid":true}', "sha256").hexdigest()
hmac.compare_digest(sig, received_sig)    # проверка подписи вебхука

Что хотят услышать

  • Три понятия: обратимо без ключа, обратимо с ключом, необратимо.
  • Свойства криптографического хеша и где он применяется.
  • Base64 — не защита.
  • HMAC и подпись сообщений — плюс.

Частые ошибки

  • «Пароли шифруем SHA-256» — это хеш, и для паролей он слишком быстрый.
  • Называть Base64 шифрованием.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем