Skip to content
Назад к блогу
Руководства

Что такое кодирование Base64? Руководство для начинающих

Только знакомитесь с Base64? Узнайте, что такое кодирование Base64, как оно работает шаг за шагом и зачем разработчики его применяют — с понятными примерами.

8 мин чтения

Знакомство с кодированием Base64

Только начинаете изучать Base64? Вы попали по адресу. Это руководство для начинающих объясняет, что такое Base64, как работает алгоритм шаг за шагом и где разработчик с ним столкнётся. Для продвинутых тем — кодирования MIME, data URL, оптимизации и аспектов безопасности — см. наше расширенное руководство по Base64.

Кодирование Base64 — фундаментальная техника, которая встречается во всей современной разработке. Встраиваете ли вы изображения в HTML, передаёте двоичные данные через текстовые протоколы или работаете с API — понимание Base64 необходимо.

Что такое Base64?

Base64 — это схема кодирования двоичных данных в текст, представляющая двоичные данные в виде ASCII-строки. Используется набор из 64 символов (A-Z, a-z, 0-9, +, /), а = применяется как padding.

Название «Base64» происходит от того, что в алфавите ровно 64 печатных ASCII-символа. Схема возникла в ранние дни электронной почты, когда стандарт MIME (Multipurpose Internet Mail Extensions) нуждался в надёжном способе прикреплять двоичные файлы — изображения и документы — к письмам, поддерживавшим только 7-битный ASCII. Base64 был формально определён в RFC 4648, а его корни восходят к спецификации PEM (Privacy Enhanced Mail) конца 1980-х. С тех пор он стал одним из самых распространённых методов кодирования в вычислениях.

Зачем нужен Base64?

  1. Передача данных: многие протоколы поддерживают только текст. Base64 позволяет безопасно передавать двоичный контент.
  2. Data URI: встраивание небольших изображений или файлов прямо в HTML/CSS через data URI.
  3. Payload API: передача двоичных данных в JSON-payload без проблем с кодировкой.
  4. Почтовые вложения: кодирование MIME использует Base64 для вложений.

Чтобы сделать это конкретнее, вот повседневные сценарии применения Base64:

  • Почтовые вложения (MIME): когда вы прикрепляете PDF или изображение, ваш почтовый клиент Base64-кодирует файл и встраивает в тело письма как текстовый блок. Клиент получателя декодирует обратно в исходный файл.
  • Встраивание изображений в HTML/CSS: вместо ссылки на внешнее изображение его можно вписать как data URL: <img src="data:image/png;base64,iVBOR...">. Это убирает дополнительный HTTP-запрос — полезно для маленьких иконок и спрайтов.
  • Хранение двоичных данных в JSON/XML: JSON и XML — текстовые форматы, которые не умеют нативно представлять сырые байты. Base64 позволяет включать двоичный контент — миниатюры, криптографические ключи, сертификаты — как обычное строковое поле.
  • HTTP Basic Authentication: заголовок Authorization кодирует учётные данные как Basic base64(username:password). Например, user:pass превращается в Basic dXNlcjpwYXNz. Учтите: это кодирование, а не шифрование, — всегда применяйте HTTPS вместе с этим методом.

Как работает Base64

Кодирование Base64 берёт каждые 3 байта (24 бита) двоичных данных и превращает их в 4 символа (по 6 бит каждый):

Исходник:  01001101 01100001 01101110  (3 байта = «Man»)
Деление:   010011 010110 000101 101110  (4 группы по 6 бит)
Base64:    T      W      F      u       (4 символа)

Пошаговый пример: кодирование «Hi»

Пройдём по короткой строке «Hi», чтобы увидеть, что происходит на каждом этапе:

1. Получаем ASCII-значения:

  • H = 72, i = 105

2. Переводим в 8-битную двоичную форму:

  • H = 01001000, i = 01101001

3. Соединяем все биты:

  • 01001000 01101001 (всего 16 бит)

4. Делим на 6-битные группы (последнюю группу дополняем нулями):

  • 010010 000110 100100
  • Исходные 16 бит требуют 3 групп по 6 (= 18 бит), поэтому добавляются 2 нулевых бита.

5. Сопоставляем каждое 6-битное значение с алфавитом Base64:

  • 010010 = 18 → S
  • 000110 = 6 → G
  • 100100 = 36 → k

6. Добавляем padding: поскольку вход — 2 байта (не кратно 3), добавляется один =.

Результат: SGk=

Правило padding простое: если длина входа mod 3 равна 1, добавляем ==; если 2 — =; если 0 — padding не нужен.

Типичные подводные камни

Увеличение размера

Base64 увеличивает размер данных примерно на 33%. Изображение в 1 МБ становится около 1,37 МБ после кодирования (точное значение зависит от переносов строк и padding). Для маленьких ассетов вроде иконок это незаметно, но для крупных файлов прибавка ощутима — видео в 10 МБ превращается в 13 с лишним. Подумайте, окупает ли удобство встраивания затраты на размер.

Это не шифрование

Base64 — это кодирование, а не шифрование. Никакой защиты он не даёт и легко декодируется. Любой может развернуть его обратно мгновенно — в JavaScript atob('SGVsbG8=') возвращает «Hello». Никогда не применяйте Base64, чтобы скрыть пароли, токены или чувствительные данные. Если нужна конфиденциальность — используйте полноценное шифрование (AES, RSA и т. п.).

URL-безопасность

В стандартном Base64 используются + и /, у которых в URL и query-строках особое значение. Например, data+test/value в стандартном Base64 сломает URL-параметр. URL-безопасный Base64 заменяет + на -, а / на _, давая такие строки, как data-test_value, которые можно использовать в URL без percent-encoding. В большинстве языков есть URL-безопасный вариант — применяйте его всегда, когда вывод Base64 окажется в URL.

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

В большинстве языков есть встроенная поддержка Base64. Вот два частых примера:

// JavaScript (браузер и Node.js)
btoa('Hello')     // "SGVsbG8="
atob('SGVsbG8=')  // "Hello"
# Python
import base64
base64.b64encode(b'Hello').decode()   # 'SGVsbG8='
base64.b64decode('SGVsbG8=').decode()  # 'Hello'
// Go
package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    encoded := base64.StdEncoding.EncodeToString([]byte("Hello"))
    fmt.Println(encoded) // "SGVsbG8="

    decoded, _ := base64.StdEncoding.DecodeString("SGVsbG8=")
    fmt.Println(string(decoded)) // "Hello"

    // URL-безопасный вариант
    urlEncoded := base64.URLEncoding.EncodeToString([]byte("Hello?World"))
    fmt.Println(urlEncoded) // "SGVsbG8/V29ybGQ="
}

В JavaScript функция btoa() (binary-to-ASCII) кодирует, а atob() (ASCII-to-binary) декодирует. Учтите, что btoa() работает только с символами Latin-1; для Unicode-строк сначала переведите их в UTF-8. Модуль base64 в Python работает с объектами bytes, поэтому строку нужно перевести в байты через b'...' или .encode() перед передачей в функцию. Пакет encoding/base64 в Go даёт «из коробки» и StdEncoding, и URLEncoding, что упрощает выбор нужного варианта. В большинстве других языков — Java, C#, Ruby, PHP — стандартные библиотеки предлагают аналогичные API в одну строку.

Использование нашего инструмента Base64

Наш кодировщик/декодер Base64 позволяет легко:

  • Кодировать текст или файлы в Base64
  • Декодировать строки Base64
  • Генерировать data URI для веб-встраивания
  • Работать с URL-безопасными вариантами

Часто задаваемые вопросы

Для чего применяется Base64?

Base64 применяется для передачи двоичных данных через каналы, поддерживающие только текст. Самые распространённые сценарии — встраивание изображений в HTML/CSS через data URI, кодирование почтовых вложений (MIME), отправка двоичных payload через JSON API и кодирование учётных данных в HTTP Basic Authentication. Когда протокол или формат поддерживает только ASCII, но нужен двоичный контент, Base64 — стандартное решение.

Это то же, что и шифрование?

Нет. Base64 — это кодирование, а не шифрование, и оно не даёт никакой безопасности. Любой может декодировать строку Base64 мгновенно с помощью встроенных функций браузера вроде atob() или утилит командной строки. Никогда не применяйте Base64 для сокрытия паролей, API-ключей или чувствительных данных. Если нужна конфиденциальность, используйте полноценные алгоритмы шифрования вроде AES-256 или RSA и всегда передавайте данные через HTTPS.

Почему Base64 увеличивает размер файла на 33%?

Base64 преобразует каждые 3 байта входа в 4 ASCII-символа выхода. Поскольку 4/3 = 1,333, закодированный вывод всегда примерно на 33% больше исходных двоичных данных. Это приемлемо для маленьких ассетов (иконки, миниатюры), но прибавляется на больших файлах: изображение в 10 МБ становится около 13,3 МБ после кодирования. Для крупных файлов прямая бинарная передача обычно эффективнее.

В чём разница между стандартным и URL-безопасным Base64?

Стандартный Base64 использует + и / как 62-й и 63-й символы алфавита, но у них в URL особое значение. URL-безопасный Base64 (определён в RFC 4648 Section 5) заменяет их на - и _, давая строки, которые можно использовать прямо в URL и именах файлов без percent-encoding. URL-безопасный Base64 применяют для JWT-токенов, URL-параметров и любого контекста, где закодированная строка попадает в URL.

Может ли Base64 работать с Unicode, например с китайским или эмодзи?

Не напрямую. Функция btoa() в JavaScript принимает только символы Latin-1. Чтобы Base64-кодировать Unicode-текст, сначала переведите его в UTF-8-байты с помощью TextEncoder, а затем кодируйте уже эти байты. В Python вызовите .encode('utf-8') перед передачей в base64.b64encode(). Этот двухшаговый процесс гарантирует, что многобайтовые символы корректно сохранятся при round-trip кодирования и декодирования.

Заключение

Base64 — универсальная схема кодирования, которую должен понимать каждый разработчик. Применяйте её, когда нужно передать двоичные данные через текстовые каналы, но помните, что это не средство безопасности и она увеличивает объём данных.


Готовы пойти глубже? Посмотрите наше расширенное руководство по Base64: от MIME к data URL — реальные паттерны реализации, примеры кода на JavaScript и Python, советы по оптимизации и аспекты безопасности.

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

Все статьи