Кодирование — это не шифрование

Base64 выглядит как «зашифрованная абракадабра», но на самом деле не защищает ничего. Разберёмся почему.

Две разные операции

Очень частая ошибка новичков — считать, что любой нечитаемый набор символов «зашифрован». Это не так. Есть две принципиально разные вещи:

КодированиеЗапись данных в другом формате. Не требует ключа. Обратимо для всех.
ШифрованиеЗащита данных ключом. Без ключа расшифровать нельзя.

Кодирование нужно, чтобы данные удобно передавались (например, картинку упаковали в текст для письма). Оно не скрывает информацию — любой может раскодировать её обратно. Шифрование же создано именно для секретности.

Base64 — классический пример кодирования

Base64 превращает любые байты в набор из 64 безопасных символов (буквы, цифры, + и /). Это удобно для пересылки, но ключа здесь нет. Запустим и убедимся, что раскодировать может кто угодно:

import base64

message = "Привет, Боб!"
encoded = base64.b64encode(message.encode("utf-8"))
print("Закодировано:", encoded.decode())

decoded = base64.b64decode(encoded).decode("utf-8")
print("Раскодировано:", decoded)

Вывод:

Закодировано: 0J/RgNC40LLQtdGCLCDQkdC+0LEh
Раскодировано: Привет, Боб!

Обрати внимание: чтобы раскодировать, нам не понадобился никакой секрет. Достаточно знать, что это Base64. Если Ева перехватит такую строку, она прочитает сообщение за секунду.

Почему это важно понимать

В реальных приложениях иногда видят строку вроде eyJ1c2VyIjoiYWRtaW4ifQ== и думают, что данные «зашифрованы». На самом деле это часто просто Base64, и его содержимое открыто. Никогда не полагайся на кодирование для защиты паролей или личных данных.

А вот так выглядит настоящее шифрование

Сравним: добавим простейший «ключ», без которого раскодирование уже не сработает. Применим операцию XOR (исключающее ИЛИ) с секретным числом:

def xor_cipher(text, key):
    return bytes(b ^ key for b in text.encode("utf-8"))

secret = xor_cipher("hello", 42)
print("Зашифровано (байты):", list(secret))

# Без ключа 42 расшифровать правильно не выйдет
wrong = bytes(b ^ 99 for b in secret)
right = bytes(b ^ 42 for b in secret)
print("Неверный ключ:", wrong.decode("utf-8", "replace"))
print("Верный ключ:", right.decode())

Вывод:

Зашифровано (байты): [66, 79, 70, 70, 69]
Неверный ключ: )$-- .
Верный ключ: hello

Здесь без правильного ключа (42) текст не восстановить — это уже шифрование, хоть и очень слабое. Запомни главное правило: если для восстановления данных не нужен секрет — это кодирование, а не защита.

Проверьте себя
1. Почему Base64 нельзя использовать для защиты паролей?
AОн слишком медленный
BРаскодировать его может любой без ключа
CОн работает только с латиницей
DОн удлиняет данные
Поддержать проект