Разработка · 3 мин чтения ·
Base64 простыми словами: зачем он нужен и почему это не шифрование
Base64 встречается в письмах, data URI, заголовках API и JWT. Как он работает, почему данные становятся на треть больше и почему он ничего не скрывает.

Base64 в программах повсюду: вложения в письмах, картинки, встроенные в CSS, заголовок Authorization в HTTP Basic и части JWT. У него одна задача — записать любые данные, включая двоичные байты, только безопасными текстовыми символами.
Как это работает
Base64 берёт данные по три байта (24 бита) и делит их на четыре группы по 6 бит. Каждая группа — число от 0 до 63, которому соответствует один из 64 символов: A-Z, a-z, 0-9, + и /. Если данные не делятся на тройки, конец дополняется знаками =.
Текст M a n
Байты 01001101 01100001 01101110
6 бит 010011 010110 000101 101110
Base64 T W F u → TWFu
Зачем он нужен
Многие старые системы, прежде всего электронная почта, создавались для текста и могли повредить произвольные байты. Base64 превращает что угодно в обычные символы, которые проходят через такие каналы без изменений. Цена — размер: каждые 3 байта становятся 4 символами, так что закодированные данные примерно на 33 % больше.
Это не шифрование
Ключа нет. Base64 может мгновенно раскодировать кто угодно, поэтому он ничего не скрывает. Пароль в заголовке Basic (dXNlcjpwYXNz — это просто user:pass) открыт так же, как обычный текст. Защищайте секреты с помощью HTTPS и настоящего шифрования и никогда не считайте Base64 мерой безопасности.
Варианты, которые вы встретите
Base64url заменяет + и / на - и _ и обычно убирает выравнивание, поэтому результат безопасен в URL и именах файлов; его используют JWT. Data URI вставляют закодированные данные прямо в код, например data:image/png;base64,iVBOR…, — это экономит запрос для крошечных картинок, но утяжеляет крупные.
Размер в цифрах
Длина закодированных данных — 4 × ceil(n / 3) символов для n байт, то есть прибавка около 33 %, плюс переносы строк, если кодировщик их добавляет.
Картинка 100 КБ → около 133 КБ в Base64
Вложение 1 МБ → около 1,33 МБ (плюс переносы строк в письме)
Почему декодирование не удаётся
- Нет выравнивания: некоторые системы отбрасывают знаки = в конце, и строгие декодеры отказываются принимать ввод. Добавьте =, пока длина не станет кратной 4.
- Не тот алфавит: Base64url использует - и _ вместо + и /. Декодируйте его декодером Base64url или сначала замените символы обратно.
- Переносы строк и пробелы: почта (MIME) переносит Base64 каждые 76 символов. Большинство декодеров переносы игнорирует, но не все.
- Текст в неправильной кодировке: декодирование даёт байты. Если это был текст в UTF-8, а его прочитали как Latin-1, кириллица, буквы с диакритикой и иврит превращаются в кракозябры.
Ловушка btoa в JavaScript
Встроенная в браузер функция btoa() принимает только символы Latin-1 и выдаёт ошибку на кириллице, иврите, китайском или эмодзи. Сначала закодируйте текст в байты UTF-8, например с помощью TextEncoder, а уже потом в Base64.
Когда его использовать, а когда нет
Base64 — правильный инструмент, когда двоичные данные должны пройти через канал, созданный для текста: JSON и XML, почта, data URI и заголовки HTTP. Он не подходит, чтобы прятать данные, чтобы их уменьшить (они всегда растут) и чтобы хранить большие файлы в базе данных, где двоичный столбец или объектное хранилище компактнее и быстрее. Если получатель принимает «сырые» байты, отправляйте «сырые» байты.
Попробуйте
Кодировщик Base64 от 4Dev переводит текст в Base64 прямо во время набора. Он использует UTF-8, поэтому кириллица, эмодзи и любой другой неанглийский текст кодируются правильно. Для обратного преобразования есть декодер Base64.