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

base64 выглядит «зашифрованным», но это лишь другой способ записи тех же данных — без всякого секрета.

Кодирование — обратимое преобразование данных в другой формат для удобства передачи или хранения. Оно не требует ключа и не защищает данные.

Три понятия, которые путают

ОперацияНужен ключ?Защищает?Пример
Кодированиенетнетbase64, URL-encoding
Хэшированиенетнеобратимый отпечатокSHA-256
Шифрованиедада, без ключа не прочитатьAES

Только шифрование скрывает содержимое от того, у кого нет ключа. Кодирование — про форму записи, хэширование — про проверку, шифрование — про секретность.

Зачем тогда нужен base64

base64 переводит произвольные байты в набор безопасных печатных символов. Это удобно, когда канал рассчитан на текст: вложить картинку в JSON, передать бинарные данные в URL или email. Цель — совместимость, а не секретность.

Любой может декодировать base64 — без ключа

Главное, что нужно запомнить: декодирование base64 не требует никакого секрета. Запустите и убедитесь:

import base64

secret = "пароль: 1234"
encoded = base64.b64encode(secret.encode("utf-8")).decode()
print("Закодировано:", encoded)

# Декодируем БЕЗ всякого ключа
decoded = base64.b64decode(encoded).decode("utf-8")
print("Раскодировано обратно:", decoded)

Вывод:

Закодировано: 0L/QsNGA0L7Qu9GMOiAxMjM0
Раскодировано обратно: пароль: 1234

Строка 0L/QsNGA... выглядит «зашифрованной», но любой инструмент мгновенно превращает её обратно в исходный текст. Никакой защиты здесь нет.

Где это путают на практике

  • «Спрятали» пароль в base64. Иногда секреты кодируют в base64 и думают, что они скрыты. Это не защита — данные читаются мгновенно.
  • JWT. Полезная нагрузка JWT — это base64, а не шифрование. Поэтому, как мы помним, секреты в токен не кладут: любой их прочитает.
  • Basic Auth. Заголовок Basic Auth — это логин и пароль в base64. Защищает их не кодирование, а только HTTPS поверх. Без HTTPS они идут практически открытым текстом.

Правило для разработчика

Если задача — скрыть данные от тех, у кого нет ключа, нужно шифрование. Если задача — передать бинарные данные через текстовый канал, подойдёт кодирование. Видите base64 там, где ожидали защиту, — это сигнал, что секретности на самом деле нет.

Итог

  • Кодирование (base64) обратимо без ключа и ничего не защищает.
  • Шифрование требует ключ и реально скрывает данные; хэш — необратимый отпечаток.
  • JWT и Basic Auth используют base64, поэтому полагаются на HTTPS, а не на «зашифрованность».
  • Нужна секретность — используйте шифрование, а не кодирование.
Проверьте себя
1. Что верно про base64?
AЭто надёжное шифрование
BЭто обратимое кодирование без ключа, не дающее защиты
CЭто разновидность хэширования
DЕго нельзя декодировать без пароля
2. Чем кодирование отличается от шифрования?
AНичем
BКодирование обратимо без ключа и не защищает, шифрование требует ключ и скрывает данные
CКодирование надёжнее
DШифрование не требует ключа
3. Почему секреты не кладут в полезную нагрузку JWT?
AОна слишком короткая
BЭто base64, который любой может прочитать без ключа
CJWT нельзя подписать
DТак требует HTTPS
Поддержать проект