Назад к блогу
Кодирование

Base64 Кодирование: Полное Руководство для Разработчиков

Если вы когда-нибудь работали с API, отправляли файлы через JSON или просто пытались понять, как работают JWT токены — вы точно сталкивались с Base64. Это одна из тех технологий, которые кажутся сложными на первый взгляд, но на самом деле всё очень просто. Давайте разбираться!

Base64 — это, по сути, способ превратить любые двоичные данные (картинки, файлы, звук) в обычный текст. Зачем это нужно? А затем, что многие системы и протоколы умеют работать только с текстом. Например, HTTP заголовки, JSON, XML — они все текстовые. А Base64 позволяет вписать туда что угодно.

Так что же такое Base64 и зачем он нужен?

Я помню, когда я впервые столкнулся с Base64 — это было при работе с email-рассылками. Оказывается, все вложения в письмах кодируются в Base64! Да, те самые картинки и PDF-файлы, которые мы отправляем по почте — они превращаются в длинные строки текста и передаются как обычный текст. А на стороне получателя они снова превращаются в файлы.

Вот основные места, где вы точно встретите Base64 в своей работе:

  • Data URLs в HTML/CSS — когда вы вставляете картинку прямо в код, без отдельного файла. Это удобно для маленьких иконок.
  • Email вложения (MIME) — всё, что вы отправляете по почте, кодируется в Base64.
  • JWT токены — те самые токены для аутентификации в API. Они состоят из трёх частей, и каждая часть — это Base64.
  • Базовая аутентификация — когда вы видите заголовок Authorization: Basic ..., это тоже Base64.
  • Передача файлов через JSON — если вам нужно отправить файл через REST API, вы можете закодировать его в Base64 и передать как строку.
  • Хранение в базах данных — когда нужно сохранить бинарные данные в текстовое поле.

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

Как это работает на самом деле

Давайте разберёмся с механикой. Я знаю, что многие разработчики используют Base64, не задумываясь о том, как он устроен. Но как только вы поймёте принцип — всё станет очевидно.

Base64 берёт 3 байта данных (это 24 бита) и превращает их в 4 символа. Почему 3 байта? Потому что 24 бита отлично делятся на 4 группы по 6 бит. А каждый символ в Base64 — это 6 бит информации. Получается, что 3 байта → 4 символа.

Алфавит Base64 состоит из 64 символов:

  • A-Z — 26 символов
  • a-z — ещё 26 символов
  • 0-9 — 10 символов
  • + и / — 2 символа
  • = — используется для дополнения, если данных не хватает

Итого 64 символа — отсюда и название.

Давайте посмотрим на примере слова "Man"

Буква "M" в двоичном виде — 01001101.
Буква "a" — 01100001.
Буква "n" — 01101110.

Объединяем: 01001101 01100001 01101110.

Разбиваем на группы по 6 бит:
010011 (это 19) → символ T
010110 (это 22) → символ W
000101 (это 5) → символ F
101110 (это 46) → символ u

Вот так "Man" превращается в "TWFu".

Всё довольно просто, правда? Теперь вы понимаете, что Base64 — это просто таблица соответствия между числами и символами.

Base64 в разных языках — примеры из реальной жизни

Когда я только начинал программировать, самым большим открытием для меня было то, что в каждом языке есть встроенные функции для работы с Base64. Вам не нужно писать свою реализацию — всё уже готово.

JavaScript (Node.js)

В Node.js всё просто — используем Buffer:

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

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

JavaScript (браузер)

В браузере есть btoa и atob, но они работают только с латиницей. Для кириллицы нужен небольшой хак:

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

function base64ToUtf8(str) {
    return decodeURIComponent(escape(atob(str)));
}

// Использование
const encoded = utf8ToBase64('Привет, мир!');
console.log(encoded); // 0J/RgNC40LLQtdGCLCDQvNC40YAh

Python

В Python — модуль base64:

import base64

text = "Привет, мир!"
encoded = base64.b64encode(text.encode('utf-8')).decode('utf-8')
print(encoded)  # 0J/RgNC40LLQtdGCLCDQvNC40YAh

decoded = base64.b64decode(encoded).decode('utf-8')
print(decoded)  # Привет, мир!

PHP

В PHP — две простые функции:

$text = "Привет, мир!";
$encoded = base64_encode($text);
echo $encoded; // 0J/RgNC40LLQtdGCLCDQvNC40YAh

$decoded = base64_decode($encoded);
echo $decoded; // Привет, мир!

Java

В Java начиная с 8-й версии есть встроенный Base64:

import java.util.Base64;

String text = "Привет, мир!";
String encoded = Base64.getEncoder()
    .encodeToString(text.getBytes("UTF-8"));
System.out.println(encoded);

byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String decoded = new String(decodedBytes, "UTF-8");
System.out.println(decoded);

Go

В Go — пакет encoding/base64:

package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    text := "Привет, мир!"
    encoded := base64.StdEncoding.EncodeToString([]byte(text))
    fmt.Println(encoded)

    decoded, _ := base64.StdEncoding.DecodeString(encoded)
    fmt.Println(string(decoded))
}

Base64 и Base64URL — в чём разница?

Однажды я потратил целый час, пытаясь понять, почему мой JWT токен не работает в URL. Оказалось, что стандартный Base64 использует символы + и /, которые в URL имеют специальное значение. Для решения этой проблемы придумали Base64URL.

Разница простая:

  • + заменяется на -
  • / заменяется на _
  • = (дополнение) убирается

Теперь ваш токен безопасно можно передавать в URL.

Функции для Base64URL на JavaScript

function base64UrlEncode(str) {
    return btoa(str)
        .replace(/\+/g, '-')
        .replace(/\//g, '_')
        .replace(/=+$/, '');
}

function base64UrlDecode(str) {
    str = str.replace(/-/g, '+').replace(/_/g, '/');
    while (str.length % 4) {
        str += '=';
    }
    return atob(str);
}

Base64 vs Hex — что лучше?

Я часто вижу этот вопрос на форумах. Hex (шестнадцатеричная система) тоже умеет кодировать данные, но делает это неэффективно — каждый байт превращается в 2 символа. Base64 же превращает 3 байта в 4 символа.

Формат Увеличение размера Пример Где используется
Base64 ~33% SGVsbG8= Email, JWT, API
Hex 100% 48656C6C6F Отладка, цвета, хеши
Binary 0% 01001000... Хранение, системы

Как видите, Base64 значительно эффективнее Hex. Поэтому для передачи данных всегда выбирайте Base64.

Производительность — что нужно знать

Есть один нюанс, о котором я узнал на собственном опыте. Когда я встраивал большое изображение (около 2 МБ) в HTML через Data URL, страница загружалась очень медленно. Оказывается, Base64 даёт +33% к размеру файла, а ещё браузер не кэширует Data URLs так же эффективно, как обычные картинки.

  • Увеличение размера: ~33% — это много для больших файлов
  • Кэширование: Data URLs не кэшируются как отдельные файлы
  • Рекомендация: Для файлов меньше 10 КБ можно использовать Data URL, для больших — лучше отдельный файл

Как я использую Base64 в реальных проектах

1. Вставка маленькой иконки в HTML

<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cD..." alt="Иконка" />

2. CSS-спрайты для быстрой загрузки

.icon-user {
    background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cD...');
}

3. Аутентификация в API

// Заголовок Authorization
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

4. Отправка файлов через JSON

{
    "name": "отчет.pdf",
    "content": "JVBERi0xLjQKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMiAwIFI..."
}
Ключевые выводы (TL;DR):
  • Base64 превращает двоичные данные в текст для передачи по текстовым протоколам.
  • Увеличивает размер данных на ~33%, но эффективнее Hex.
  • Используется в JWT, email, Data URLs, базовой аутентификации.
  • Base64URL — безопасная версия для URL (заменяет + и /).
  • Это кодирование, а не шифрование — не используйте для защиты данных.

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

Что такое Base64 и зачем он нужен?

Это способ превратить любые двоичные данные в текст. Нужен для передачи данных по текстовым протоколам (HTTP, email, JSON).

Base64 — это безопасно?

Нет. Это кодирование, а не шифрование. Любой может декодировать ваши данные. Если нужно защитить данные — используйте шифрование.

На сколько увеличивается размер данных?

Примерно на 33%. Файл 100 КБ станет 133 КБ.

Что такое Base64URL?

Это версия Base64, безопасная для URL. Заменяет + на -, / на _ и убирает =.

Как декодировать Base64 в браузере?

Используйте atob(encoded). Для кириллицы — через decodeURIComponent(escape(atob(encoded))).

В итоге

Base64 — это простой, но очень полезный инструмент. Я использую его почти каждый день: для отладки API, для вставки иконок, для работы с JWT токенами. Надеюсь, это руководство поможет вам разобраться и начать использовать Base64 в своих проектах.

Кстати, у нас есть онлайн-конвертер Base64 — можете попробовать закодировать и декодировать текст прямо сейчас. Это бесплатно и работает в браузере.