Интернет и кодирование · 5 минута чтения
Base64 декодировать и кодировать: для транспорта, а не для
Base64 существует для перемещения двоичных данных по каналам, которые принимают только текст. Он отображает каждые три байта в четыре печатаемых символа, поэтому закодированный вывод примерно на треть больше, чем входной, и почему декодирование base64 полностью обратимо — без ключа, поскольку base64 — это кодирование, а не шифрование. Любой может декодировать все, что вы кодируете, и любой инструмент, который предлагает обратное, лжет вам.
Обновлено
Алфавит и отступы
Стандартный алфавит — `A–Z`, `a–z`, `0–9`, `+` и `/`, с `=` дополняет последнюю группу, когда длина ввода не кратна трем. Это дополнение не является декоративным: оно сообщает декодеру, сколько байтов содержит последняя группа. Удаление этого типа распространено в URL-адресах и работает, поскольку декодеры определяют длину, но строгие реализации отклоняют недополненную форму.
"YamlBox" → WWFtbEJveA==
"YamlBo" → WWFtbEJv
base64url: вариант, который заканчивается в токенах
URL-адреса рассматривают `+`, `/` и `=` как значимые, поэтому вариант base64url заменяет их на `-` и `_` и часто полностью опускает заполнение. Каждый веб-токен JSON использует этот алфавит, поэтому полезная нагрузка JWT, вставленная в строгий декодер Base64, может не работать с символами, которые выглядят совершенно обычными. Если строка декодируется во что-то почти, но не совсем читаемое, вы обычно находитесь на расстоянии одной замены алфавита от ответа.
Где вы встретите это на практике
- URI данных — встраивание небольших изображений и шрифтов непосредственно в CSS или HTML как `data:image/png;base64,…`.
- JSON Веб-токены — каждый из трёх сегментов имеет кодировку Base64url.
- Базовая аутентификация HTTP — `Authorization: Basic` содержит base64 из `user:password`, поэтому он всегда должен передаваться по TLS.
- Вложения электронной почты. MIME использует base64 для двоичных частей с 1980-х годов.
- API, которые не могут принимать двоичные данные — полезные данные изображений и ключи, помещенные в текстовые поля.
Почему вывод декодирования Base64 выглядит как мусор
Классическим провалом является Unicode. Старые версии JavaScript `btoa` и `atob` работают с одним байтом на символ, поэтому строка, содержащая `é`, `₹` или любой эмодзи, либо генерирует, либо генерирует моджибаке. Решение состоит в том, чтобы сначала закодировать байты UTF-8 — `TextEncoder` в браузере, `Buffer.from(str, "utf8")` в Node — а затем в Base64. Если декодирование возвращает правдоподобные, но неверные символы, наиболее вероятной причиной является то, что кодер вообще не преобразовывал текст в байты UTF-8.
Base64 не обеспечивает конфиденциальности или целостности. Относитесь к закодированному секрету точно так же, как к необработанному секрету, потому что он так и есть.
Зачем декодировать локально
Заголовки базовой аутентификации, токены и URI данных декодируются в учетные данные или личные данные, поэтому их вставка в декодер на стороне сервера является раскрытием информации. Кодер/декодер YamlBox Base64 работает на странице с правильной обработкой UTF-8, поддерживает как стандартный, так и URL-безопасный алфавиты и работает в автономном режиме.
Base64 Кодер/декодер — часто задаваемые вопросы
Является ли Base64 шифрованием?
Нет. Это обратимая кодировка без ключа, поэтому ее может расшифровать любой. Он существует для того, чтобы двоичные данные могли передаваться только по текстовым каналам, но не для защиты данных. Используйте TLS и реальное шифрование, такое как AES-GCM, для обеспечения конфиденциальности.
Насколько больше выходной сигнал Base64?
Ровно на треть больше плюс небольшое дополнение, потому что три байта становятся четырьмя символами. Именно из-за этих накладных расходов base64 используется для небольших встроенных ресурсов и избегается для больших.
Почему декодирование Base64 возвращает странные символы?
Обычно происходит несоответствие кодировки: исходный текст не был преобразован в байты UTF-8 перед кодированием, или вы декодируете данные base64url с помощью стандартного декодера. Проверьте наличие символов `-` и `_` и убедитесь, что исходный кодировщик использует UTF-8.
Инструменты, упомянутые в этом посте
Еще статьи для чтения
6 минута чтения
JWT декодер: что внутри токена, а что нет
Используйте декодер JWT для проверки заголовка, полезной нагрузки и срока действия токена – и поймите, почему декодирование не проверяется, поскольку проверки утверждений стоят за большинством 401.
5 минута чтения
Кодировка URL: когда бежать, а когда что-то ломаешь
URL правильно кодировать и декодировать — зарезервированные символы плюс %20, encodeURI и encodeURIComponent, а также ошибки двойного кодирования в неработающих ссылках.
5 минута чтения
cURL для извлечения: перемещение запроса с терминала в браузер
cURL для получения преобразования для JavaScript: заголовки, тела, проверка подлинности и методы отображаются правильно, а также реальность CORS, которая решает, работает ли запрос.