Чем хеширование отличается от шифрования и кодирования?
- 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 минут бесплатно.