Разработка · 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.

Открыть кодировщик Base64

LinkedInXFacebook