Вопрос с собеседования · Основы

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

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

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

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

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

Подробно

Кодирование меняет представление данных, чтобы их можно было передать: 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 шифрованием.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Base64 — надёжное шифрование
  • ✗Хеш можно расшифровать, зная ключ
  • ✓Кодирование обратимо без секрета, шифрование — только с ключом, хеширование — необратимый отпечаток
  • ✗Шифрование необратимо, хеширование обратимо

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

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования