Все статьи
Кодирование

Base64 — что это и как работает

Принцип кодирования Base64, алфавит, padding, использование в Data URI, email, API. Примеры кодирования.

14 февраля 2025
9 мин чтения
ConvertHub
#base64#кодирование#data-uri

Введение

Base64 — это способ представления произвольных бинарных данных в виде строки, состоящей исключительно из печатных ASCII-символов. Изначально схема разработана для нужд электронной почты MIME, где любой附件 должен пройти через текстовые каналы связи, не допускающие байты с установленным старшим битом. Сегодня Base64 встречается везде: в JSON Web Token, в Data URI внутри HTML и CSS, в API REST, в файловых хранилищах и даже в куки-файлах. В этой статье мы разберём, как устроено Base64 кодирование, какой у него алфавит, что такое padding и почему «Base64» не означает «шифрование».

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

Зачем нужно кодирование Base64

Любые данные в компьютере хранятся в виде последовательности байтов. Каждый байт может принимать 256 значений — от 0 до 255. При этом многие протоколы и форматы (email, HTTP-заголовки, JSON, XML) рассчитаны только на текст и не позволяют передавать произвольные байты напрямую. Если в потоке появится нулевой байт или символ с кодом выше 127, промежуточные узлы могут его «съесть», заменить или интерпретировать как управляющий.

Base64 решает эту проблему радикально: любые входные байты преобразуются в строку, содержащую только 64 «безопасных» символа из таблицы ASCII. Такая строка гарантированно пройдёт через любой текстовый канал без искажений. Цена — увеличение размера примерно на 33%, потому что каждые три байта исходных данных превращаются в четыре символа.

Алфавит Base64

Стандартный алфавит Base64 описан в RFC 4648 и состоит из 64 символов: 26 заглавных букв латиницы (A–Z), 26 строчных (a–z), 10 цифр (0–9) и двух дополнительных символов — плюса (+) и слэша (/). Знак равенства (=) используется как символ выравнивания (padding) и не входит в основной алфавит.

ИндексСимволИндексСимволИндексСимволИндексСимвол
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

Существуют и вариации алфавита. Вариант Base64url заменяет «+» на «-», а «/» на «_», чтобы строку можно было безопасно использовать в URL и именах файлов без percent-encoding. Именно Base64url применяется в JWT — подробнее в статье о структуре JWT токена.

Как работает Base64: пошаговый алгоритм

Принцип кодирования очень прост. Берём входной поток байтов, разбиваем его на группы по три байта (24 бита) и каждую такую группу делим на четыре 6-битных куска. Каждые 6 бит дают число от 0 до 63 — это индекс в алфавите Base64, по которому выбирается символ.

Пример: кодируем строку «Cat»

Строка «Cat» в ASCII состоит из трёх байтов: 0x43 0x61 0x74. В двоичном виде это:

01000011 01100001 01110100

Разбиваем 24 бита на четыре 6-битных группы:

010000 110110 000101 110100
  = 16     = 54    = 5     = 52
  = Q      = 2     = F     = 0

Итог: Q2F0. Проверим в JavaScript:

const encoded = btoa('Cat');
console.log(encoded); // "Q2F0"

const decoded = atob('Q2F0');
console.log(decoded); // "Cat"

Что происходит с «хвостом»

Если длина входных данных не кратна трём, остаются «лишние» байты — один или два. Тогда последний блок дополняется нулями до 6 бит, а недостающие символы заменяются знаком равенства. Это и есть padding.

  • 1 байт (8 бит) → 2 символа Base64 + «==»
  • 2 байта (16 бит) → 3 символа Base64 + «=»
  • 3 байта (24 бита) → 4 символа, padding не нужен

Пример: кодируем «C» (один байт):

btoa('C'); // "Qw=="
btoa('Ca'); // "Q2E="
btoa('Cat'); // "Q2F0"

Где применяется Base64

Электронная почта и MIME

Исторически первая область применения. Сообщение MIME помечает бинарное вложение заголовкомContent-Transfer-Encoding: base64, после чего содержимое кодируется в Base64. Так почтовые серверы гарантированно передают файлы без повреждений.

Data URI в HTML и CSS

Небольшие изображения, шрифты и SVG можно встроить прямо в HTML или CSS с помощью схемыdata:. Например:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..." alt="иконка">

Подробно об этой технике читайте в статье о Data URI scheme.

JSON Web Token

JWT состоит из трёх частей: header, payload и signature. Каждая часть — это JSON, сериализованный и кодированный в Base64url. Это позволяет передавать токен в HTTP-заголовкеAuthorization: Bearer ... без экранирования. Подробнее — в материале о JWT токене.

API и REST

Бинарные данные (файлы, изображения) в JSON API часто передают в виде Base64-строки в теле запроса. Это удобно, но увеличивает объём передаваемых данных примерно на треть — для больших файлов лучше использовать multipart/form-data.

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

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

Если нужно защитить данные — используйте настоящие криптографические primitives: симметричное шифрование (AES), хеширование с солью (bcrypt, scrypt) или подпись сообщения (HMAC). Подробнее о HMAC — в нашей статье про аутентификацию сообщений.

Размер и эффективность

Главная плата за «безопасность канала» — рост объёма. Формула проста:ceil(4 × n / 3), то есть на каждые три входных байта получается четыре символа. С учётом padding итоговый размер всегда кратен четырём байтам.

Размер исходных данныхРазмер в Base64Рост
1 КБ1.37 КБ+37%
10 КБ13.7 КБ+37%
100 КБ137 КБ+37%
1 МБ1.37 МБ+37%

Для коротких строк относительная «дороговизна» менее заметна, а вот встраивание в Data URI фотографий по несколько мегабайт сильно раздувает HTML. Кроме того, браузер не кеширует встроенные ресурсы независимо от страницы — каждый раз при повторном заходе они загружаются заново.

Частые ошибки при работе с Base64

1. Использование строкового конструктора для бинарных данных

// НЕПРАВИЛЬНО: теряем байты со старшим битом
const broken = btoa(String.fromCharCode(...imageBytes));

// ПРАВИЛЬНО: используем Uint8Array и TextDecoder
const bytes = new Uint8Array(imageData);
let binary = '';
for (let i = 0; i < bytes.length; i++) {
  binary += String.fromCharCode(bytes[i]);
}
const base64 = btoa(binary);

2. Игнорирование кодировки символов

btoa() работает только с Latin1 символами. Если попытаться закодировать кириллицу напрямую, будет выброшено исключение. Сначала нужно преобразовать строку в UTF-8 байты:

function encodeUtf8(str) {
  return btoa(unescape(encodeURIComponent(str)));
}

function decodeUtf8(b64) {
  return decodeURIComponent(escape(atob(b64)));
}

encodeUtf8('Привет, мир!');
// "D0/fgD8PfgD8PfgD8PfgD8PfgD8PfgD8PfgD8PfgD8PfgD8"

3. Путаница с Base64 и Base64url

Стандартный Base64 содержит символы «+» и «/», которые в URL имеют особый смысл. Если вставить такую строку в query-параметр без экранирования, сервер получит искажённые данные. Решение — либо использовать Base64url, либо применять URL encoding. О нём — в статье про percent-encoding.

Base64 в разных языках программирования

JavaScript (Node.js)

// Кодирование
const encoded = Buffer.from('Привет, мир!', 'utf8').toString('base64');

// Декодирование
const decoded = Buffer.from(encoded, 'base64').toString('utf8');

Python

import base64

# Кодирование
encoded = base64.b64encode('Привет, мир!'.encode('utf-8')).decode('ascii')

# Декодирование
decoded = base64.b64decode(encoded).decode('utf-8')

PHP

<?php
$encoded = base64_encode('Привет, мир!');
$decoded = base64_decode($encoded);

Безопасность и best practices

  • Не используйте Base64 как защиту. Это кодирование, а не шифрование. Для конфиденциальных данных применяйте AES или хотя бы XOR с ключом достаточной длины.
  • Проверяйте длину. Корректная Base64-строка всегда кратна четырём символам; если это не так — данные повреждены.
  • Учитывайте padding. Большинство декодеров терпимо относятся к отсутствию «=», но стандарт требует их наличия.
  • В URL используйте Base64url. Это убережёт от неожиданностей с экранированием.
  • Не вставляйте большие файлы в Data URI. Для изображений больше 10–20 КБ лучше использовать обычную ссылку на файл — это ускорит загрузку страниц.

Заключение

Base64 — простой, надёжный и повсеместно поддерживаемый способ преобразовать бинарные данные в текстовый формат. Он незаменим в email, JWT, Data URI, API и во многих других задачах, где данные должны пройти через текстовый канал без искажений. Главное — помнить, что Base64 не является шифрованием и не защищает данные от прочтения; его задача принципиально иная — обеспечить совместимость с текстовыми протоколами.

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

Попробуйте эти инструменты

Похожие статьи