Base64: что это за кодировка и как закодировать строку в JS, Python и терминале

Base64 записывает любые байты текстом из 64 символов, так картинки попадают в HTML и JSON.

Разбираем алгоритм на слове Man, рабочий код на JavaScript и Python, команды терминала, Base64url и ошибки InvalidCharacterError и Incorrect padding.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2944 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3598 экспертных мнений Подписаться на Телеграм-канал
Обложка: Base64: что это за кодировка и как закодировать строку в JS, Python и терминале

Base64 записывает любые байты обычным текстом из 64 символов: латинских букв A–Z и a–z, цифр 0–9, знаков + и /. Ещё есть знак =, им добивают конец строки. Каждые три байта превращаются в четыре символа, поэтому данные вырастают примерно на треть.

Закодировать строку можно одной командой: btoa() в браузере, модуль base64 в Python, утилита base64 в терминале macOS и Linux. Ниже разберём алгоритм на примере, рабочий код для JavaScript и Python и ошибки, на которых чаще всего ломаются.

Важно с самого начала: Base64 не шифрует. Любой, кто видит строку, раскодирует её за секунду.

CheckroiCheckroiПодборка курсов по JavaScript182 курса • 30 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что такое Base64 и где он нужен

Рой упаковывает картинку в ленту из букв и цифр, чтобы отправить её письмом

Многие форматы и протоколы рассчитаны на текст. Письмо, JSON, адрес страницы, атрибут в HTML: туда нельзя просто положить байты картинки или архива, часть из них окажется управляющими символами и сломает разбор. Base64 переводит такие байты в безопасный набор символов, а на другой стороне их восстанавливают без потерь.

Где кодировка встречается чаще всего:

  • Вложения в письмах. Почтовый стандарт MIME (RFC 2045) описывает передачу файлов в Base64 и требует, чтобы строки были не длиннее 76 символов.
  • Картинки прямо в HTML и CSS. Схема data: вставляет файл в код страницы: data:text/plain;base64,SGVsbG8sIFdvcmxkIQ== (MDN).
  • Файлы в запросах к API. В JSON нет типа «байты», поэтому изображение или PDF кладут в поле строкой Base64.
  • Заголовок авторизации. В схеме Basic логин и пароль склеиваются через двоеточие и кодируются в Base64 (RFC 7617): Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==.
  • Токены JWT. Три части токена записаны вариантом Base64url, о нём ниже.

Base64 прячет текст от беглого взгляда, но не защищает его. Стандарт RFC 4648 прямо пишет в разделе о безопасности, что такая кодировка не даёт никакой вычислительной конфиденциальности.

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

Как работает кодирование Base64

Три цветных блока делятся на четыре одинаковые плитки

Алгоритм удобно разобрать на слове Man. Его три буквы занимают три байта, то есть 24 бита. Base64 делит эти 24 бита на четыре группы по 6 бит, а 6 бит дают ровно 64 варианта, отсюда и название.

  1. Берём коды символов: M = 77, a = 97, n = 110.
  2. Записываем их в двоичном виде подряд: 01001101 01100001 01101110.
  3. Режем ту же цепочку по 6 бит: 010011 010110 000101 101110.
  4. Переводим группы в числа: 19, 22, 5, 46.
  5. Находим символы по таблице алфавита: 19 → T, 22 → W, 5 → F, 46 → u.

Получилось TWFu. Python выдаёт то же самое: base64.b64encode(b"Man") возвращает b'TWFu'.

Таблица символов Base64

Алфавит устроен по порядку, поэтому его не нужно заучивать целиком:

Значение Символы В варианте Base64url
0–25 A–Z A–Z
26–51 a–z a–z
52–61 0–9 0–9
62 + —
63 / _
выравнивание = = или без него

Откуда берутся знаки = в конце

Если длина данных не делится на три, последней группе не хватает байтов. Тогда недостающее место помечают знаком =: один байт в хвосте даёт два знака, два байта дают один. Вот контрольные примеры из раздела 10 того же стандарта, мы прогнали их через Python, совпадение полное:

Исходная строка Base64
f Zg==
fo Zm8=
foo Zm9v
foob Zm9vYg==
fooba Zm9vYmE=
foobar Zm9vYmFy

Из этого же правила видно, насколько вырастет файл. Три байта всегда превращаются в четыре символа, так что прирост около 33 %: фрагмент программы размером 3 000 байт у нас превратился в строку из 4 000 символов. В письмах добавляются ещё переводы строк через каждые 76 символов.

Из-за этого прироста через data: в HTML и CSS имеет смысл встраивать мелкие иконки. Крупную фотографию выгоднее подключить отдельным файлом.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Base64 в JavaScript: btoa, atob и кириллица

В браузере есть две встроенные функции: btoa() кодирует, atob() раскодирует. С латиницей они работают сразу:

btoa("Hello");     // "SGVsbG8="
atob("SGVsbG8=");  // "Hello"

На кириллице btoa() падает. Функция принимает только символы, которые помещаются в один байт, а русская буква в UTF-8 занимает два. В Chrome это выглядит так:

btoa("Привет");
// InvalidCharacterError: Failed to execute 'btoa' on 'Window':
// The string to be encoded contains characters outside of the Latin1 range.

Самым простым решением MDN называет такое: сначала перевести строку в байты UTF-8 через TextEncoder, а при раскодировании собрать её обратно через TextDecoder.

const bytes = new TextEncoder().encode("Привет");
let bin = "";
for (const b of bytes) bin += String.fromCharCode(b);
btoa(bin);  // "0J/RgNC40LLQtdGC"

const back = Uint8Array.from(atob("0J/RgNC40LLQtdGC"), c => c.charCodeAt(0));
new TextDecoder().decode(back);  // "Привет"

Новый способ: toBase64 и fromBase64

У массивов байтов Uint8Array появились собственные методы, и цикл стал не нужен. По данным MDN, они работают в актуальных версиях всех основных браузеров с сентября 2025 года, но в старых браузерах их может не быть.

new TextEncoder().encode("Привет").toBase64();          // "0J/RgNC40LLQtdGC"
Uint8Array.fromBase64("0J/RgNC40LLQtdGC");              // байты строки «Привет»
new Uint8Array([251, 255, 254]).toBase64({ alphabet: "base64url" });  // "-__-"

Node.js: Buffer

На сервере привычнее работать через Buffer, он сразу понимает UTF-8:

Buffer.from("Привет", "utf8").toString("base64");          // "0J/RgNC40LLQtdGC"
Buffer.from("0J/RgNC40LLQtdGC", "base64").toString("utf8"); // "Привет"

Все примеры этого раздела мы запустили в Node.js 25 и в Chrome 152, вывод в комментариях взят из консоли.

Base64 в Python

В Python за кодировку отвечает стандартный модуль base64, ставить ничего не нужно. Функции работают с байтами, поэтому строку перед кодированием переводят через .encode("utf-8"):

import base64

code = base64.b64encode("Привет".encode("utf-8"))
print(code)                                  # b'0J/RgNC40LLQtdGC'
print(base64.b64decode(code).decode("utf-8"))  # Привет

Если вы раньше не запускали код на Python, сначала посмотрите первые простые примеры, а потом возвращайтесь сюда.

Для адресов и имён файлов есть urlsafe_b64encode(). По документации Python, она подставляет - вместо + и _ вместо /:

raw = bytes([251, 255, 254])
print(base64.b64encode(raw))          # b'+//+'
print(base64.urlsafe_b64encode(raw))  # b'-__-'

Если файл нужно отправить письмом, подойдёт base64.encodebytes(): она сама вставляет перевод строки после каждых 76 символов, как требует MIME. Проверяли в Python 3.14.

Как закодировать в Base64 в терминале

В macOS и Linux утилита base64 уже установлена. Кодировать удобно так:

printf 'Привет' | base64          # 0J/RgNC40LLQtdGC
echo '0J/RgNC40LLQtdGC' | base64 -d  # Привет

Обратите внимание на printf. Команда echo добавляет в конец перевод строки, и он тоже попадает в результат:

echo 'Hello' | base64    # SGVsbG8K  (закодирован и перевод строки)
printf 'Hello' | base64  # SGVsbG8=

Чтобы закодировать файл целиком, в macOS пишут base64 -i файл -o результат.txt. В Linux (GNU coreutils) достаточно base64 файл, но вывод там по умолчанию режется на строки по 76 символов. Одной строкой его отдаст флаг -w 0.

Чем Base64url отличается от обычного Base64

В адресе страницы знаки + и / имеют своё значение: плюс в параметрах читается как пробел, а косая черта делит путь. Поэтому для ссылок, имён файлов и токенов придумали вариант с другими двумя символами (раздел 5 стандарта).

Что сравниваем Base64 Base64url
62-й и 63-й символы + и / — и _
Знак = в конце ставится часто опускают
Где встречается письма, data:, JSON ссылки, имена файлов, JWT
Пример для байтов 251, 255, 254 +//+ -__-

В JWT знаков = в конце нет: стандарт RFC 7515 описывает Base64url без знаков = в конце и без переводов строк. Если такую часть токена нужно разобрать обычным декодером, знаки = сначала придётся вернуть.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Как раскодировать Base64 и понять, что внутри

Строку Base64 обычно видно сразу. В ней только латиница, цифры, + и /, длина делится на четыре, а в конце часто стоят один или два знака =. Раскодировать такую строку можно тремя способами, выбирайте по тому, что у вас открыто.

  • Консоль браузера (F12 → Console): atob("SGVsbG8="). Подходит для латиницы, для кириллицы нужен код с TextDecoder из раздела выше.
  • Терминал macOS и Linux: echo 'SGVsbG8=' | base64 -d.
  • Python из командной строки, без единой строчки кода: echo '0J/RgNC40LLQtdGC' | python3 -m base64 -d выведет «Привет». Нужен только установленный Python.

Как узнать файл по первым символам

Иногда в Base64 лежит не текст, а файл: картинка в JSON, вложение из письма, документ из API. Тип часто видно ещё до раскодирования, потому что у форматов постоянное начало, и в Base64 оно тоже даёт постоянные символы. Мы закодировали стандартные сигнатуры форматов и получили вот что:

Строка начинается с Скорее всего это
iVBORw0KGgo картинка PNG
/9j/ картинка JPEG
R0lGODlh анимация GIF
JVBERi0 документ PDF
UEsDB архив ZIP, а также файлы DOCX и XLSX, которые внутри устроены как ZIP

Такую строку не печатают как текст, а сохраняют в файл: base64 -d -i data.txt -o picture.png в macOS или base64 -d data.txt > picture.png в Linux.

И совет из практики: строки с токенами, паролями и личными данными не вставляйте в онлайн-декодеры. Консоль браузера и терминал справятся не хуже, а данные останутся у вас.

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

Рой доволен: строка раскодировалась без ошибок

Почти все проблемы сводятся к двум вещам: путаница байтов и символов и испорченный хвост строки.

Что видите Причина Что сделать
InvalidCharacterError в btoa() в строке кириллица или эмодзи перевести строку в UTF-8 через TextEncoder или взять toBase64()
После atob() вместо текста набор вроде «ÐÑивеѻ байты UTF-8 прочитаны как отдельные символы собрать Uint8Array и раскодировать TextDecoder
binascii.Error: Incorrect padding в Python потерялись знаки =, например строка пришла из JWT или ссылки дописать =, пока длина не станет кратна четырём
Строка из терминала кончается на K, o= или Cg== echo добавил перевод строки кодировать через printf или echo -n
Сервер получил строку с пробелами вместо плюсов обычный Base64 вставили в параметр ссылки использовать Base64url или encodeURIComponent()

Отдельно про безопасность. Пароль, ключ API или персональные данные в Base64 остаются открытыми: заголовок Basic, по словам самого RFC 7617, передаёт логин и пароль открытым текстом. Такие запросы отправляют только по HTTPS, а секреты в коде и конфигах хранят отдельно.

Как устроены сами запросы и заголовки, мы разбирали в статьях про методы HTTP и сетевые протоколы.

Где освоить JavaScript системно

Если Base64 понадобился впервые, скорее всего, вы как раз дошли до загрузки файлов, запросов к API или авторизации. Это базовые темы курсов по JavaScript, и там их разбирают на практических заданиях.

Ниже курсы по JavaScript с рейтингом и отзывами учеников, полный список на странице курсов JavaScript.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
JavaScript
Перейти на сайт курса
SkillboxSkillbox63 829 ₽4086 ₽/мес.3 месяцаОбзор курса
Fullstack разработчик JavaScript
Перейти на сайт курса
OTUSOTUS75 000 ₽20 000 ₽/мес.6 месяцевОбзор курса
Факультет fullstack JavaScript
Перейти на сайт курса
GeekBrainsGeekBrains134 700 ₽3742 ₽/мес.15 месяцевОбзор курса
Fullstack-разработчик на Node.js
Перейти на сайт курса
HexletHexlet109 000 ₽6137 ₽/мес.12 месяцевОбзор курса
Fullstack-разработчик на JavaScript
Перейти на сайт курса
Академия ЭдюсонЭдюсон158 760 ₽6615 ₽/мес.11 месяцевОбзор курса

Больше программ — в полном каталоге курсов по JavaScript

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

Является ли Base64 шифрованием?

Нет, это кодировка. Ключа у неё нет, поэтому любую строку Base64 раскодирует кто угодно за секунду. Стандарт RFC 4648 прямо пишет, что такая кодировка не даёт вычислительной конфиденциальности. Чтобы спрятать данные, нужен настоящий шифр и HTTPS при передаче.

Как расшифровать строку Base64?

В консоли браузера наберите atob("строка"), в терминале macOS и Linux выполните echo 'строка' | base64 -d, а если установлен Python, подойдёт python3 -m base64 -d. Для кириллицы в браузере нужен TextDecoder, иначе вместо букв появятся символы вроде «Ð».

Зачем в конце строки Base64 знаки «=»?

Base64 кодирует данные кусками по три байта. Если в последнем куске один байт, в конце ставят два знака «=», если два байта, то один. Когда длина данных делится на три, знаков «=» нет совсем: «foobar» кодируется как Zm9vYmFy.

Насколько Base64 увеличивает размер файла?

Примерно на треть: каждые три байта превращаются в четыре символа, так что файл на 3 000 байт станет строкой из 4 000 символов. В письмах добавляются ещё переводы строк через каждые 76 символов.

Как вставить картинку в HTML через Base64?

Закодируйте файл командой base64 -i picture.png в macOS или base64 -w 0 picture.png в Linux и вставьте результат в адрес вида data:image/png;base64,iVBORw0KGgo… в атрибуте src или в CSS. Способ удобен для маленьких иконок: картинка вырастет на треть, поэтому крупные файлы лучше подключать обычной ссылкой.

Чем Base64url отличается от Base64?

В Base64url вместо «+» и «/» стоят «-» и «_», а знаки «=» в конце часто убирают. Такую строку можно вставить в ссылку или имя файла без экранирования. Этим вариантом записаны части токенов JWT.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!