Кодирование для передачи: Base64 и hex
Base64 часто путают с шифрованием. Это распространённая и опасная ошибка. Разберём, что такое кодирование и зачем оно нужно.
Кодирование — это НЕ защита. Любой может раскодировать Base64 за секунду. Это просто способ записать данные.
Зачем вообще кодировать
Хеши и зашифрованные данные — это сырые байты, часто непечатаемые. Их нельзя просто вставить в URL, JSON или письмо: некоторые байты «сломают» текст. Кодирование превращает любые байты в безопасный набор обычных символов.
Hex: каждый байт — две цифры
Шестнадцатеричное кодирование записывает каждый байт двумя символами 0-9a-f. Так обычно показывают хеши.
import hashlib
data = "Привет".encode("utf-8")
print("Сырые байты:", data)
print("В hex: ", data.hex())
print("Обратно: ", bytes.fromhex(data.hex()).decode("utf-8"))
print()
print("SHA-256 в hex:", hashlib.sha256(data).hexdigest())
Base64: компактнее, чем hex
Base64 использует 64 символа (буквы, цифры, + и /) и кодирует данные плотнее hex. Им часто пересылают картинки в HTML, токены и вложения в письмах.
import base64
raw = "secret data 123".encode()
encoded = base64.b64encode(raw)
print("Исходник: ", raw)
print("Base64: ", encoded)
print("Декодировано:", base64.b64decode(encoded).decode())
Главное заблуждение: Base64 — это НЕ шифр
Декодирование не требует никакого ключа. Кто угодно вернёт исходные данные:
import base64
# 'Зашифровано'? Нет, просто закодировано
looks_secret = "cGFzc3dvcmQ6IGh1bnRlcjI="
print("Выглядит загадочно:", looks_secret)
print("Раскодировали без ключа:", base64.b64decode(looks_secret).decode())
print("=> Base64 НЕ скрывает данные, только переупаковывает их")
Когда что использовать
| Цель | Инструмент |
|---|---|
| Скрыть данные от посторонних | Шифрование (AES и др.) |
| Доказать целостность | Хеш (SHA-256) |
| Записать байты как текст для передачи | Кодирование (Base64/hex) |
Часто их сочетают: данные сначала шифруют, а потом результат кодируют в Base64, чтобы безопасно отправить. Но сам по себе Base64 защиты не даёт.
Вывод:
Кодирование (Base64, hex) превращает сырые байты в безопасный для передачи текст и обратимо без ключа. Это НЕ шифрование: Base64 ничего не скрывает. Шифрование прячет, хеш проверяет целостность, кодирование — переупаковывает.
Проверьте себя
1. Чем Base64 принципиально отличается от шифрования?
ABase64 надёжнее AES
BBase64 обратим без ключа и ничего не скрывает — это просто способ записать байты текстом
CBase64 нельзя раскодировать обратно
DBase64 требует пароль для декодирования