Руководства

Что такое Base64: история, принцип работы и применение

Разбираем происхождение Base64, преобразование 3 байтов в 4 символа, padding, base64url, расходы и сценарии применения.

Base64 одним предложением

Base64 — это кодирование двоичных данных в текст: любая последовательность байтов превращается в строку из небольшого совместимого алфавита. Алгоритм не выясняет, представляют ли байты фотографию, PDF или слово; он лишь упаковывает их для текстовых систем.

Преобразование обратимо и не теряет данные, но не является шифрованием, хешированием или сжатием.

Откуда появился Base64

Ранние сети и почтовые системы не всегда сохраняли произвольные 8-битные значения. Шлюзы ожидали печатный 7-битный текст и могли менять двоичные данные. Более ранние схемы, например uuencode, решали ту же задачу; 64-символьное печатное кодирование Privacy-Enhanced Mail из RFC 1421 — прямой предшественник современного Base64.

Позже MIME назвал Base64 способом Content-Transfer-Encoding для тел писем и вложений. RFC 4648 2006 года стал общей спецификацией стандартного и URL-безопасного алфавитов. Это результат развития совместимых стандартов, а не одиночное изобретение.

Почему 64 символа и как работает правило 3 в 4

Шесть бит дают ровно 64 значения от 0 до 63. Стандартный Base64 сопоставляет им A–Z, a–z, 0–9, + и /. Кодировщик читает три байта — 24 бита — и делит их заново на четыре группы по 6 бит. Значение каждой группы служит индексом в алфавите и выдаёт один символ.

Для “Man” байты ASCII/UTF-8 дают индексы 19, 22, 5 и 46: T, W, F и u. Результат — TWFu; декодирование проходит тот же путь в обратную сторону.

“Man” полностью заполняет 24-битный блок, поэтому padding не нужен.
Ввод
Man
Входные байты
01001101 01100001 01101110
6-битные группы
010011 010110 000101 101110
Индексы алфавита
19 · 22 · 5 · 46
Вывод Base64
TWFu

Padding, Unicode и base64url

Последний блок из одного байта создаёт два полезных символа и ==, из двух байтов — три символа и =. Заполнение ничего не скрывает: оно сообщает, сколько реальных данных было в последнем 24-битном блоке. Некоторые протоколы опускают его, если длина известна иначе.

Base64 работает с байтами. Кириллица, 中文 и emoji сначала преобразуются, обычно в UTF-8. Для URL и имён файлов base64url заменяет + и / на - и _. Это родственный алфавит, но смешивать варианты без учёта протокола нельзя.

Где Base64 действительно полезен

Классические примеры — MIME-вложения, PEM-блоки сертификатов и ключей, а также data: URL для небольших изображений и шрифтов. JSON и XML могут переносить небольшие двоичные данные строкой. HTTP Basic использует Base64, а части JWT — base64url; секретными данные от этого не становятся.

Смысл в совместимости: внешний канал требует текст, а полезная нагрузка состоит из байтов. Если загрузка, объектное хранилище или BLOB уже принимает двоичные данные, Base64 может быть лишним.

Цена в размере и производительности

Каждые три полных байта становятся четырьмя символами. Точная длина равна 4 × ceil(n / 3), поэтому для больших данных прирост близок к 33,3%, а для маленьких бывает выше. Переносы строк и префикс data: URL добавляют ещё немного.

Сжатие на другом уровне может уменьшить трафик, но кодирование всё равно расходует память и процессор. Большие файлы обычно проще передавать напрямую в двоичном виде.

Чего Base64 не делает

Base64 не обеспечивает конфиденциальность и подлинность: строку можно декодировать и изменить без ключа. Он не защищает пароли, API-токены и персональные данные. Для секретности нужны шифрование и TLS, для отпечатка — криптографический хеш, для контроля изменений — подпись или MAC.

Короткое правило: Base64 пересекает текстовую границу, но не защищает границу безопасности.

Технические источники