Как пользоваться
- Выберите «Кодировать» или «Декодировать». Вариант «Безопасный для URL (RFC 4648 §5)» уже выбран, а дополнение отключено.
- Введите или вставьте текст, введите шестнадцатеричные байты или откройте файл. Результат обновляется по мере ввода.
- Включайте «Дополнение» только в том случае, если принимающая система требует знаки = в конце.
- Скопируйте результат или скачайте его.
Что такое Base64URL?
Base64URL описан в разделе 5 RFC 4648 как «Base 64 Encoding with URL and Filename Safe Alphabet», то есть кодирование Base64 с алфавитом, безопасным для URL и имён файлов. Он работает точно так же, как стандартный Base64, по 6 бит на символ, но заменяет два символа, которые вызывают проблемы в URL и путях к файлам:
| Стандартный Base64 | Base64URL | |
|---|---|---|
| Значение 62 | + | - |
| Значение 63 | / | _ |
| Дополнение | =, обязательно | обычно опускается |
В URL символ + может быть прочитан как пробел, / разделяет сегменты пути, а = отделяет имена параметров запроса от значений, поэтому стандартный Base64 перед вставкой в ссылку приходится экранировать с помощью процентного кодирования (percent-encoding). Base64URL не требует экранирования. RFC 4648 разрешает опускать дополнение, если длина известна из контекста, и большинство спецификаций на основе Base64URL так и поступают.
Где используется Base64URL
- JSON Web Token. Заголовок, полезная нагрузка и подпись JWT кодируются в Base64URL без дополнения (RFC 7515). Прочитать токен можно с помощью декодера JWT.
- OAuth 2.0 PKCE. Значение
code_challenge— это хеш SHA-256 от code verifier, записанный в Base64URL без дополнения (RFC 7636), поэтому его длина всегда составляет 43 символа. - JSON Web Key и WebAuthn. Параметры ключей, например
n,e,xиy, а также challenge и идентификаторы учётных данных WebAuthn передаются в Base64URL. - Токены, идентификаторы и имена файлов. Ссылки для сброса пароля, подписанные URL и ключи кеша содержат Base64URL без экранирования; случайный 16-байтовый идентификатор превращается в 22 символа. В файловых системах, не учитывающих регистр, лучше использовать Base32, потому что Base64URL зависит от регистра букв.
Преобразование между Base64 и Base64URL
Оба варианта кодируют одни и те же байты, поэтому преобразование сводится к замене символов: замените + на -, / на _ и удалите = в конце. Для обратного преобразования снова поменяйте символы и добавляйте =, пока длина не станет кратной 4. Декодер на этой странице принимает оба алфавита, с дополнением и без него.
// Node.js 16+
Buffer.from(data).toString('base64url')
Buffer.from(str, 'base64url')
# Python (urlsafe_b64encode сохраняет дополнение)
base64.urlsafe_b64encode(data).rstrip(b'=')
// Go
base64.RawURLEncoding.EncodeToString(data)
// Java
Base64.getUrlEncoder().withoutPadding().encodeToString(bytes)
Спецификация
| Алфавит | A-Z a-z 0-9 - _ |
|---|---|
| Размер результата | 4 символа на каждые 3 байта (около 133%) |
| Дополнение | Необязательно, обычно опускается |
| Стандарт | RFC 4648, раздел 5 |
| Учёт регистра | Да |
Примеры
| Исходные данные (UTF-8) | Результат |
|---|---|
Hello, World! | SGVsbG8sIFdvcmxkIQ |
Base64.is | QmFzZTY0Lmlz |
你好 | 5L2g5aW9 |
Часто задаваемые вопросы
Base64URL — это то же самое, что URL-кодирование строки Base64?
+, / и = превращаются в %2B, %2F и %3D, и строка становится длиннее. В Base64URL используется другой алфавит, поэтому экранирование вообще не требуется. Без преобразования эти две формы не взаимозаменяемы.Нужно ли дополнение в Base64URL?
urlsafe_b64encode в Python и стандартный URL-кодировщик в Java добавляют его. Если сомневаетесь, опускайте его: этот декодер принимает обе формы.Почему стандартный декодер Base64 отклоняет мою строку Base64URL?
- и _, а некоторые требуют дополнения. Замените символы и добавьте знаки =, чтобы длина стала кратной 4, или декодируйте строку здесь.Как проверить code challenge в PKCE?
BASE64URL(SHA256(code_verifier)) без дополнения. Декодируйте его здесь с выводом в Hex: правильное значение даёт ровно 32 байта, которые можно сравнить с хешем SHA-256 от verifier.