Как декодировать Base64URL
- Вставьте строку в поле Ввод · Base64. При открытии страницы там уже есть URL-safe пример.
- Результат появится в поле Результат · текст. Строка статуса показывает вариант (Base64URL или Standard), число декодированных байтов и определённый тип. Если дополнения не было, там будет написано «Недостающее дополнение добавлено автоматически».
- Внутри токенов обычно лежит JSON, и опция Форматировать JSON расставит в нём отступы.
- Для двоичного содержимого, например хешей или случайных ID, инструмент сообщит, что это двоичные данные, и даст ссылку на подходящий декодер.
- Нажмите Скопировать результат или Скачать.
Для кодирования есть кодировщик Base64URL. Чтобы перевести строку Base64URL в стандартный Base64 без декодирования, используйте Base64URL в Base64.
Примеры
| Base64URL | Результат | Примечание |
|---|---|---|
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | {"alg":"HS256","typ":"JWT"} | Типичный заголовок JWT |
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSIsImFkbWluIjp0cnVlfQ | {"sub":"1234567890","name":"Ada","admin":true} | Полезная нагрузка JWT; дополнение восстановлено |
c3ViamVjdHM_X2Q | subjects?_d | _ заменяет / в URL-safe-алфавите |
8J-Riw | 👋 | - заменяет + в URL-safe-алфавите |
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM | 32 двоичных байта | Хеш SHA-256, пример PKCE из RFC 7636 |
Для хеша из последней строки текстовый вывод бессмыслен. Откройте его в Base64 в hex, чтобы увидеть байты как 13 d3 1e 96 ....
Дополнение и почему его можно восстановить
Base64URL обычно пишут без =. Информация при этом не теряется: длина корректной строки составляет 4n, 4n + 2 или 4n + 3 символа, и по остатку декодер понимает, один или два байта в последней группе. Инструмент добавляет недостающие = перед декодированием и сообщает об этом в строке статуса.
Длины 4n + 1 не бывает. Если вы видите ошибку «Неверная длина: на один символ больше или меньше, чем нужно», при копировании значения символ потерялся или добавился, например на переносе строки в письме или в логе. Арифметику показывает статья о дополнении.
Многие стандартные декодеры не так снисходительны. atob() в браузерах отвергает - и _ с InvalidCharacterError, а base64.urlsafe_b64decode в Python выбрасывает Incorrect padding, если нет =.
Токены, cookie и параметры URL
- JWT. Токен выглядит как
xxxxx.yyyyy.zzzzz. В первых двух частях лежит JSON в Base64URL, третья содержит двоичную подпись. Декодируйте части здесь по одной или вставьте токен целиком в декодер JWT, который заодно показывает срок действия и проверяет подписи. Формат разобран в статье Base64 в JWT. - Cookie и ID сессий. Сессионные cookie некоторых фреймворков, например Flask, соединяют точками данные в Base64URL и подпись. Декодируйте только часть с данными.
- Параметры URL. OAuth
state, адреса редиректа и ссылки «поделиться» иногда несут JSON в Base64URL. Если в значении есть%2Fили%2B, его вдобавок percent-кодировали, так что сначала нужно URL-декодирование.
Если в строке смешаны - или _ с + или /, декодер останавливается с сообщением «Во входных данных смешаны символы стандартного (+ /) и URL-safe (- _) алфавитов». Обычно это значит, что склеили два значения или одно сконвертировали лишь частично.
Декодирование Base64URL в коде
// Node.js
Buffer.from("c3ViamVjdHM_X2Q", "base64url").toString("utf8"); // "subjects?_d"
// Browsers with Uint8Array.fromBase64
new TextDecoder().decode(Uint8Array.fromBase64("c3ViamVjdHM_X2Q", { alphabet: "base64url" }));
import base64
def b64url_decode(s: str) -> bytes:
return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
b64url_decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") # b'{"alg":"HS256","typ":"JWT"}'
Строка, которая дописывает знаки равенства, подходит для любой длины, допустимой в Base64. Подробнее в статьях Base64 в Node.js, JavaScript и Python.
Вопросы и ответы
Как декодировать Base64URL?
Вставьте строку в поле выше, настраивать ничего не нужно. В коде замените - на + и _ на /, допишите =, пока длина не станет кратной 4, и декодируйте как обычный Base64. Можно и сразу взять URL-safe декодер, например Buffer.from(s, "base64url") в Node.
Почему появляется ошибка про символ «.»?
Вы вставили JWT целиком. Его три части разделены точками, и каждую нужно декодировать отдельно. Вставьте одну часть или воспользуйтесь декодером JWT для всего токена.
Почему для моей строки Base64URL в строке статуса написано Standard?
В строке нет ни -, ни _, ни +, ни /, поэтому она корректна в обоих алфавитах и декодируется одинаково. Многие заголовки JWT именно такие.
Что делать, если значение ещё и percent-encoded?
Закодированный = (%3D) обрабатывается. Другие escape-последовательности, например %2F, означают, что значение прошло URL-кодирование; сначала пропустите его через URL-декодер.