Command Palette

Search for a command to run...

Объяснение кодировки Base64: кодирование и декодирование как профессионал

Объяснение кодировки Base64: кодирование и декодирование как профессионал

T
Toolz Team
|Jun 18, 2026|15 Мин. читать

Часть коллекции кодирующий

Первая версия конвертера Base64, которую я отправил на Toolz.dev, имела ошибку I'm все еще слегка смущен.Он работал идеально в каждом тесте, который я написал - закодированный, декодированный, с круговым движением, сделано. Затем кто-то вставил текст, содержащий эмодзи, и получил вот что

Uncaught DOMException: InvalidCharacterError:
Failed to execute 'btoa' on 'Window': The string to be
encoded contains characters outside of the Latin1 range.

Я построил инструмент кодирования текста и забыл, что текст включает, знаете ли, большинство текста. Каждый нелатинский сценарий, каждый акцентированный персонаж, каждый эмодзи - сломан. Все мои тесты были ASCII, потому что я думаю в ASCII. Эта ошибка научила меня Base64 большему, чем любое чтение спецификаций, и I' покажет вам исправление позже, потому что оно сбивает с толку почти всех, кто прикасается btoa(), йо-

Base64 - одна из тех вещей, которые разработчики используют ежедневно - внутри каждого JWT, каждого вложения электронной почты, каждого data: УРИ - при редком заглядывании под капот Let's заглядывают под капот.

TL;DR: Кодировка Base64 преобразует двоичные данные в 64 безопасных символа ASCII, чтобы они могли перемещаться по текстовым каналам, таким как JSON, URL-адреса и электронная почта, что обходится в ~33%. Это так не Шифрование; любой может отменить его мгновенно. Чтобы закодировать или декодировать прямо сейчас, используйте бесплатную клиентскую сторону Конвертер Base64 на Toolz.dev - ваши данные никогда не покидают браузер, что имеет значение, когда вы 're декодируете токены.


Что такое кодировка base64?

Base64 — это схема кодирования бинарного в текст: она представляет собой произвольные байты, используя всего 64 символа, которые выдерживают каждую построенную текстовую систему. Авторитетная спецификация RFC 4648 (2006), хотя кодировка восходит к RFC 1421 и Privacy Enhanced Mail в 1993 году - Base64 старше веб-браузера.

алфавит:

  • A–Z → Значения 0–25
  • a–z → Значения 26–51
  • 0–9 → Значения 52–61
  • + → 62, / → 63
  • = → Заполнение (не значение, просто наполнитель)

Почему эти 64? Потому что они выживают без искажений в ASCII, EBCDIC и всех когда-либо созданных шлюзах электронной почты. Base64 — это мирный договор с десятилетиями инфраструктуры, состоящей только из текста.

Стоимость договора: каждые 3 входных байта становятся 4 выходными символами - фиксированный налог на размер 33%. Держите это число в голове; оно решает вопросы реальной архитектуры.


Как работает алгоритм base64?

Более короткий ответ, чем вы 'd ожидать: перегруппировать биты из 8s в 6s, затем искать их в таблице. 26 = 64 - это's откуда имя.

кодирующий Hi!,

Шаг 1 - байты в биты.

характер Аскии бинарный
h 72 01001000
я 105 01101001
! 33 00100001

Связанный: 010010000110100100100001- 24 бита.

Шаг 2 - перегруппируйтесь в 6-битные фрагменты.

010010 | 000110 | 100100 | 100001
  18   |   6    |   36   |   33

Шаг 3 - посмотрите каждое значение в алфавите.

18 → S, 6 → G, 36 → k, 33 → h, йо- поэтому Hi! кодирует в SGkh, йо-

Это весь алгоритм. Никакой математики, кроме таблицы поиска.

набивка Обрабатывает входы, которые не кратны 3 байтам. закодировать просто Hi (2 байта = 16 бит) и вы можете заполнить только 2-х битные группы 6-битных шифровальных узлов; кодер нулевых площадок = Чтобы подать сигнал, сколько стоит наполнитель:

Hi  → SGk=    (2 bytes remaining → one '=')
H   → SA==    (1 byte remaining  → two '==')
Hi! → SGkh    (multiple of 3     → no padding)

Когда я реализовал это для конвертера Toolz.dev, заполнение было местом, где жили все мои ошибки, выключенные на одного. если вы когда-нибудь вручную перекатывали Base64 - для кодирования интервью, скажем - сначала напишите тесты заполнения.

Декодирование — это зеркальное отображение: символы возвращаются к 6-битным значениям, перегруппируйтесь в 8-битные байты, отбрасывайте отступы.

Base64 encoding process diagram showing binary conversion, 6-bit grouping, and character mapping


где вы на самом деле бежите в base64?

JWT - большой

Каждый токен JSON состоит из трех сегментов, закодированных в base64url, соединенных точками: заголовок, полезная нагрузка, подпись. Отладка аутентификации — это 50% декодирование.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

расшифровать первый сегмент и вы получите {"alg":"HS256","typ":"JWT"}, йо- Второй дает вам претензии. Мой рабочий процесс, когда токен ведет себя не так: разделить по точкам, расшифровать каждую часть в Конвертер Base64, затем вставьте JSON в Форматтер JSON правильно читать. две пасты, и вы знаете, exp Претензия - ваша проблема.

Стоит прямо сказать: полезные нагрузки JWT читается любой, кто держит токен, йо- Подпись перестает вмешиваться, а не читать. Я рассмотрел кодовые базы, которые вставляли конфиденциальные данные в претензии, потому что тарабарщина выглядит подразумеваемой конфиденциальностью. это не так.

JWT being decoded with Base64 converter showing header, payload, and signature parts

УРИС данных

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

Встраивание небольших ресурсов в встроенный HTTP-запрос. Мое правило, основанное на создании пользовательского интерфейса администратора WordPress с большим количеством изображений: стоит ~5 КБ, за 10 КБ, вы раздули документ на 33%, чтобы сохранить запрос мультиплексов HTTP/2.

Секреты Кубернета - и разглагольствования

apiVersion: v1
kind: Secret
data:
  password: cGFzc3dvcmQ=   # decodes to "password"

Секреты Kubernetes закодированы в Base64, и ложная безопасность, которую это подразумевает, вызывает тревогу. Это значение декодируется в одну пасту. Base64 здесь существует, поэтому двоичные значения выживают в YAML - a форматирование решение, а не охранное. Если ваша история заканчивается на "он 39;base64 в etcd", она не запущена.

остальная часть списка

HTTP-заголовки Basic Auth (Authorization: Basic dXNlcjpwYXNz Декодирует на обычную user:pass- отсюда только HTTPS). Вложения электронной почты через MIME. Двоичные блоки внутри полезных данных JSON, поскольку у JSON нет двоичного типа.


Является ли шифрование base64? (Нет. Пожалуйста, нет.)

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

base64 представитель, например, писать число в шестнадцатеричном формате. Нет ключа. Нет секрета. Для декодирования не требуется ничего, кроме таблицы алфавита, напечатанной публично в RFC 4648. Все, что защищает, защищено тем, что буква защищается от написания курсивом.

Если данные требуют конфиденциальности: шифрование надлежащим образом (AES-GCM или Libsodium), к тому же Base64-кодируйте зашифрованный текст, если каналу нужен текст. Кодирование и шифрование составляют нормально - они просто aren&#39;t заменяет. и если вам нужна целостность, а не секретность, это&#39;s работа hash&#39;s - the хэш-генератор Обложки SHA-256 и друзей.


Как Base64 сравнивается с Hex, кодировкой URL и Base85?

база64 Шестнадцатеричная (база16) URL/процент кодирования ASCII85
размер накладных расходов +33% +100% 0–200%, зависит от содержания +25%
алфавит 64 символа 16 символов Асции + %XX побеги 85 символов
Чтение на выходе человека нет Видны границы байтов В основном для входа ASCII нет
По умолчанию безопасный URL нет (+, /, =)) да Да, по определению нет
вы встретите его в JWTS, MIME, URI данных хэши, MAC-адреса, цветовые коды Строки запроса PDF-внутренности

Как я выбираю: гекс когда люди будут читать или сравнивать выходные данные - контрольные суммы, дайджесты, все, что отлажено глазным яблоком. процент-кодировка Для текста URL, никогда не двоичного. база64 для двоичного пересечения текстового канала - большинство реальных случаев. ASCII85 Никогда добровольно; 8% экономии еще не оправдывают вопросы совместимости.


Что такое URL-безопасная base64 и почему она существует?

Стандартная база64 имеет проблему: + означает "пробел" в строках запроса, / Является ли разделитель пути, = разграничивает параметры. поместите токен standard-Base64 в URL-адрес, и какое-нибудь промежуточное программное обеспечение где-нибудь исказит его - с перерывами и только в производстве. Спросите меня, откуда я знаю.

РФЦ 4648 Раздел 5 определяет исправление, обычно называемое base64url:

стандартный безопасный
+ -
/ _
= набивка обычно просто опущен

Тот же алгоритм, два символа поменялись местами, заполнение было исключено. JWT используют исключительно Base64URL - именно поэтому вставка сегмента JWT в строгий стандартный декодер Base64 иногда терпит неудачу при случайном ударе - или _, йо- выше Конвертер Toolz.dev Обрабатывает оба варианта, потому что декодер, который отклоняет половину реального Base64, не является декодером.

Практическое правило: если закодированная строка когда-либо будет касаться URL-адреса, имени файла или заголовка HTTP, используйте вариант, безопасный для URL. Модернизация — это находка и замена плюс молитвы.


Как вы кодируете и декодируете в коде?

JavaScript - ловушка, в которую я попал

Вот наивная версия, та, которую я отправил:

btoa('Hello')      // "SGVsbG8=" — great!
btoa('café ☕')    // InvalidCharacterError — the bug from my intro

btoa Предшествует современной обработке Unicode и принимает только Latin-1. Правильный современный подход явно проходит через байты UTF-8:

// Encode: string → UTF-8 bytes → Base64
const bytes = new TextEncoder().encode('café ☕');
const encoded = btoa(String.fromCharCode(...bytes));   // "Y2Fmw6kg4piV"

// Decode: Base64 → bytes → string
const decoded = new TextDecoder().decode(
  Uint8Array.from(atob(encoded), c => c.charCodeAt(0))
); // "café ☕"

(В Node.js пропустите церемонию: Buffer.from(str, 'utf8').toString('base64').)

питон

import base64

encoded = base64.b64encode('café ☕'.encode('utf-8')).decode('ascii')
decoded = base64.b64decode(encoded).decode('utf-8')

# URL-safe variant — note -_ instead of +/
token = base64.urlsafe_b64encode(b'binary\xfb\xff').decode('ascii')

Python делает правильным очевидным: вы должник Передавайте байты, поэтому шаг кодирования к UTF-8 не может быть забыт. я хочу btoa был разработан с тем же позвоночником.

php

$encoded = base64_encode('café ☕');   // handles bytes as-is — PHP strings ARE bytes
$decoded = base64_decode($encoded);

// URL-safe requires manual translation — a WordPress-plugin-developer classic:
$urlSafe = rtrim(strtr($encoded, '+/', '-_'), '=');

что strtr/rtrim Строка появилась в каждой базе кодов PHP, над которой я когда-либо работал, включая WP Adminify. В PHP никогда не было встроенного, безопасного для URL-адреса, поэтому мы все продолжаем писать одни и те же две строки.


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

Для чего используется кодировка base64?

Он преобразует двоичные данные в текст ASCII, чтобы он мог проходить только через системы, которые обрабатывают только текст: полезные нагрузки JSON, URL-адреса, электронную почту (MIME), заголовки HTTP. Вы встречаете его чаще всего в токенах JWT, data: URI для встроенных изображений, секретов Kubernetes и полезной нагрузки API, несущих файлы. Это транспортный формат, а не формат хранения или безопасности.

Base64 — это то же самое, что шифрование?

Нет, и путаница двух вызывает реальные инциденты безопасности. Base64 не имеет ключа - для декодирования требуется только общедоступная таблица алфавита, и принимает одну вставку в любой декодер, йо- Сначала зашифруйте с помощью реального алгоритма (AES-GCM), затем закодируйте шифртекст, если каналу нужен текст.

Почему Base64 увеличивает данные на 33%?

Каждый символ Base64 несет 6 бит информации, но занимает полный 8-битный байт, поэтому 3 байта ввода всегда становятся 4 символами вывода - 4/3 ≈ 1.33. It&#39;s фиксированная стоимость формата, неизбежная по замыслу. если размер имеет значение, сжимайте перед кодированием, никогда после - закодированный вывод выглядит случайным и ужасно сжимается.

Какая разница между base64 и base64url?

Base64url свопы + в связи с - а / в связи с _, и обычно падает = заполнение, так что вывод выживает URL-адреса, имена файлов и заголовки, не ускользая. Тот же алгоритм в противном случае, определенный в разделе 5 RFC 4648. JWT используют исключительно Base64URL - вот почему строгие стандартные декодеры Base64 иногда подавляются ими.

Почему btoa() выдает invalidCharacterError?

Ваша строка содержит символы за пределами Latin-1 - смайлик, символ с акцентом, любой незападный сценарий. btoa API 1990-х годов, предшествующий разумной обработке Unicode. Кодируйте в байты UTF-8 сначала с помощью TextEncoder, затем base64 байты, я отправил именно эту ошибку в производственный инструмент, так что не суждено судить.

Как определить, что строка является base64?

Только действительный Base64 использует A–Z, a–z, 0–9, +, / (или -, _ Для URL-безопасности), опциональное завершение =, с длиной, которая &#39;s кратно 4 при дополнении. Но множество обычных слов также соответствуют этому шаблону - cafe допустимо base64, который декодирует в байты мусора. Настоящим тестом является декодирование и проверка того, имеет ли значение результат.

Почему в конце моей строки base64 есть новая строка?

потому что echo добавляет один до base64 когда-нибудь видел, так что echo "hunter2" | base64 Кодирует восемь байтов, а не семь. printf или echo -n вместо этого. Это причина номер один секретов Kubernetes, которые выглядят правильно в манифесте и выходят из строя во время выполнения: декодированный пароль несет невидимый трейлинг \n, йо- выше base64 команда также переносит вывод в 76 столбцов в некоторых системах - pass -w 0 На GNU CoreUtils подавлять его.

Как декодировать токен JWT вручную?

Разделите токен на две его точки, возьмите первый сегмент (заголовок) и второй (полезная нагрузка) и пропустите каждую через Base64 декодер- они&#39;re Base64URL, поэтому используйте инструмент, который принимает - а _, йо- Затем отформатируйте полученный JSON в Форматтер JSON читать претензии. Никогда не вставляйте производственные токены в серверные инструменты, только на стороне клиента.

Как закодировать изображение или файл в base64?

Прочтите файл как байты, затем base64 те байты и добавьте заголовок data-uri, например data:image/png;base64, Таким образом, браузер может визуализировать его в строке. В JavaScript, FileReader.readAsDataURL() делает оба шага за вас; в командной строке, base64 logo.png печатает необработанную кодировку. Держите ее в небольших активах - налог на размер в 33% делает Base64 плохо подходящим для чего-либо большого, а URI больших данных раздувают ваш HTML или CSS.

Как декодировать base64 в javascript, python или терминале?

В современном JavaScript декодируйте unicode-безопасно с new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))) а не голый atob, йо- В питоне, base64.b64decode(str) возвращает байты - вызов .decode('utf-8') для текста. В терминале, echo "aGk=" | base64 -d (или --decode). Все три ожидают стандартного base64, поэтому переводите -/_ в +// Сначала, если вы обрабатываете строку base64url.


Вынос

Base64 - это трюк с перетасовкой битов 30-летней давности, который незаметно удерживает половину современной сети - токены аутентификации, вложения, встроенные активы, секреты - что-aren&#39;t-secret. Поймите 6-битную перегруппировку, соблюдайте налог в размере 33%, никогда не принимайте его за шифрование и обратитесь к безопасному для URL-адресов варианту, где бы ни использовался URL-адрес. Это и #39; 95% практического мастерства Base64.

Для практичной части, Конвертер Base64 на Toolz.dev выполняет стандартную и безопасную для URL-адресов кодировку полностью в вашем браузере, созданную кем-то, кто усвоил урок Юникода на собственном горьком опыте, поэтому вам не нужно &#39; не обязательно.

Еще в этой серии: Полная Руководство по инструментам кодирования охватывает остальные дневные утилиты, Руководство по строительству регулярных выражений Занимается другими разработчиками навыков, которые притворяются, что у них есть, и поскольку половина отладки Base64 заканчивается в JSON, Ultimate JSON Инструменты это естественное следующее чтение.


Связанные статьи:

Frequently Asked Questions

It converts binary data into ASCII text so it can pass through systems that only handle text: JSON payloads, URLs, email (MIME), HTTP headers. You meet it most often in JWT tokens, data: URIs for inline images, Kubernetes Secrets, and API payloads carrying files. It's a transport format, not a storage or security format.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!