Первая версия конвертера 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–25a–z→ Значения 26–510–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?
JWT - большой
Каждый токен JSON состоит из трех сегментов, закодированных в base64url, соединенных точками: заголовок, полезная нагрузка, подпись. Отладка аутентификации — это 50% декодирование.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
расшифровать первый сегмент и вы получите {"alg":"HS256","typ":"JWT"}, йо- Второй дает вам претензии. Мой рабочий процесс, когда токен ведет себя не так: разделить по точкам, расшифровать каждую часть в Конвертер Base64, затем вставьте JSON в Форматтер JSON правильно читать. две пасты, и вы знаете, exp Претензия - ваша проблема.
Стоит прямо сказать: полезные нагрузки JWT читается любой, кто держит токен, йо- Подпись перестает вмешиваться, а не читать. Я рассмотрел кодовые базы, которые вставляли конфиденциальные данные в претензии, потому что тарабарщина выглядит подразумеваемой конфиденциальностью. это не так.

УРИС данных
<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't заменяет. и если вам нужна целостность, а не секретность, это's работа hash'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'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-безопасности), опциональное завершение =, с длиной, которая 's кратно 4 при дополнении. Но множество обычных слов также соответствуют этому шаблону - cafe допустимо base64, который декодирует в байты мусора. Настоящим тестом является декодирование и проверка того, имеет ли значение результат.
Почему в конце моей строки base64 есть новая строка?
потому что echo добавляет один до base64 когда-нибудь видел, так что echo "hunter2" | base64 Кодирует восемь байтов, а не семь. printf или echo -n вместо этого. Это причина номер один секретов Kubernetes, которые выглядят правильно в манифесте и выходят из строя во время выполнения: декодированный пароль несет невидимый трейлинг \n, йо- выше base64 команда также переносит вывод в 76 столбцов в некоторых системах - pass -w 0 На GNU CoreUtils подавлять его.
Как декодировать токен JWT вручную?
Разделите токен на две его точки, возьмите первый сегмент (заголовок) и второй (полезная нагрузка) и пропустите каждую через Base64 декодер- они'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't-secret. Поймите 6-битную перегруппировку, соблюдайте налог в размере 33%, никогда не принимайте его за шифрование и обратитесь к безопасному для URL-адресов варианту, где бы ни использовался URL-адрес. Это и #39; 95% практического мастерства Base64.
Для практичной части, Конвертер Base64 на Toolz.dev выполняет стандартную и безопасную для URL-адресов кодировку полностью в вашем браузере, созданную кем-то, кто усвоил урок Юникода на собственном горьком опыте, поэтому вам не нужно ' не обязательно.
Еще в этой серии: Полная Руководство по инструментам кодирования охватывает остальные дневные утилиты, Руководство по строительству регулярных выражений Занимается другими разработчиками навыков, которые притворяются, что у них есть, и поскольку половина отладки Base64 заканчивается в JSON, Ultimate JSON Инструменты это естественное следующее чтение.
Связанные статьи:



