Base64 URL-safe

Кодирование и декодирование URL-safe Base64 (Base64url)

Обычный текст

Base64

Работает локально · Безопасно вставлять секреты
Вывод Base64...

Что такое кодирование Base64url?

Base64url — это вариант кодирования Base64, разработанный специально для использования в URL, именах файлов и других контекстах, где стандартные символы Base64 + и / создают проблемы. Определённый в RFC 4648, раздел 5, Base64url заменяет + на - (дефис) и / на _ (подчёркивание), а также убирает символы набивки = в конце строки. В результате получается строка, которую можно встраивать прямо в параметр запроса URL, имя файла или HTTP-заголовок без дополнительного процентного кодирования.

Стандартный Base64 (RFC 4648, раздел 4) использует 64 символа: A-Z, a-z, 0-9, + и /. Символы + и / зарезервированы в URL: + интерпретируется как пробел в строках запроса (application/x-www-form-urlencoded), а / является разделителем пути. Поэтому использование стандартного Base64 внутри URL требует процентного кодирования этих символов (%2B, %2F), что увеличивает длину строки и затрудняет её чтение. Base64url полностью устраняет эту проблему, используя URL-безопасные символы с самого начала.

Наиболее известное применение Base64url — JSON Web Tokens (JWT). Все три сегмента JWT — заголовок, полезная нагрузка и подпись — кодируются в Base64url. OAuth 2.0 PKCE code verifier, значения challenge в WebAuthn и многие схемы API-токенов также опираются на Base64url. Понимание этого кодирования необходимо любому разработчику, работающему с аутентификацией, авторизацией или криптографическим обменом данными.

Зачем использовать этот инструмент Base64url?

Конвертируйте текст или бинарные данные в Base64url и обратно прямо в браузере. Поддерживается как кодирование, так и декодирование с автоматической обработкой набивки и замены символов. Отлаживаете ли вы JWT-токен, генерируете PKCE code challenge или создаёте URL-безопасные идентификаторы — этот инструмент обрабатывает всё локально в вашем браузере без какой-либо задержки и без обращений к серверу.

Мгновенное преобразование
Результат обновляется по мере ввода. Кодируйте текст в Base64url или декодируйте Base64url обратно в текст без задержки — без отправки форм и перезагрузки страницы.
🔗
URL-безопасный вывод
Вывод использует только символы, безопасные в URL, именах файлов и HTTP-заголовках: A-Z, a-z, 0-9, дефис и подчёркивание. Процентное кодирование не требуется.
🔒
Обработка с приоритетом конфиденциальности
Всё кодирование и декодирование выполняется локально в браузере. JWT-токены, секреты OAuth и API-ключи, которые вы вставляете сюда, никогда не передаются на какой-либо сервер.
🏛️
Соответствие стандартам
Реализует RFC 4648, раздел 5 в точности: - и _ заменяют + и /, набивка опущена. Совместимо с JWT-библиотеками, OAuth 2.0 PKCE и реализациями WebAuthn.

Сценарии использования Base64url

Анализ JWT-токенов
Декодируйте отдельные сегменты JWT (заголовок, полезную нагрузку), чтобы проверить утверждения, время истечения срока действия и алгоритмы подписи без импорта JWT-библиотеки и верификации подписи.
Поток OAuth 2.0 PKCE
Генерируйте и проверяйте значения PKCE code_verifier и code_challenge. Метод code_challenge_method S256 требует SHA-256 хеша code_verifier, закодированного в Base64url.
Интеграция WebAuthn / FIDO2
Challenge, credential ID и данные аттестации WebAuthn передаются как строки Base64url между браузером и сервером проверяющей стороны. Декодируйте их для отладки процессов регистрации и аутентификации.
Генерация API-токенов
Создавайте URL-безопасные токены из случайных байт для ссылок сброса пароля, подтверждения email и идентификаторов сессий. Base64url генерирует компактные строки, которые работают в URL без экранирования.
DevOps и CI/CD пайплайны
Храните бинарные значения конфигурации (сертификаты, ключи) в виде строк Base64url в переменных окружения или YAML-файлах. В отличие от стандартного Base64, вывод не содержит символов, конфликтующих с раскрытием переменных оболочки или синтаксисом YAML.
Инженерия данных
Кодируйте бинарные идентификаторы, хеши или контрольные суммы в Base64url для использования в именах файлов, ключах баз данных или столбцах CSV, где символы + и / нарушат разбор или потребуют экранирования.

Стандартный Base64 и Base64url: отличия

Base64url отличается от стандартного Base64 ровно тремя аспектами. Алгоритм кодирования идентичен — изменяются только алфавит и поведение набивки:

ХарактеристикаСтандартный (RFC 4648 §4)Base64url (RFC 4648 §5)
Index 62+-
Index 63/_
Padding= (required)Omitted

Эти три отличия означают, что преобразование между стандартным Base64 и Base64url тривиально: замените + на -, / на _ и удалите символы = в конце. В обратном направлении замените - на +, _ на / и добавьте набивку, чтобы длина была кратна 4. Большинство языков предоставляют встроенную поддержку Base64url, делая ручное преобразование излишним. Оба преобразования полностью обратимы и не приводят к потере данных — исходная последовательность байт сохраняется в точности. Эта совместимость гарантирована спецификацией RFC 4648.

Таблица сравнения кодирований

В таблице ниже одни и те же входные данные закодированы стандартным Base64 и Base64url. Обратите внимание, что символы набивки (=) убраны, а + и / заменены на - и _ в URL-safe варианте:

Входные данныеСтандартный Base64Base64url (без набивки)
HelloSGVsbG8=SGVsbG8
AQQ==QQ
1+1=2MSsxPTI=MSsxPTI
subject?ref=1c3ViamVjdD9yZWY9MQ==c3ViamVjdD9yZWY9MQ
👍 (thumbs up)8J+RjQ==8J-RjQ

Примеры кода

Как кодировать и декодировать строки Base64url на популярных языках. Каждый пример создаёт вывод, безопасный для использования в URL, именах файлов и HTTP-заголовках:

JavaScript (browser)
// Encode to Base64url
function toBase64url(str) {
  return btoa(unescape(encodeURIComponent(str)))
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '')
}
toBase64url('Hello!') // → "SGVsbG8h"

// Decode from Base64url
function fromBase64url(b64url) {
  const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')
  const pad = (4 - b64.length % 4) % 4
  return decodeURIComponent(escape(atob(b64 + '='.repeat(pad))))
}
fromBase64url('SGVsbG8h') // → "Hello!"
Node.js
// Native base64url support since Node 15.7
const encoded = Buffer.from('Hello!').toString('base64url')
// → "SGVsbG8h"

const decoded = Buffer.from('SGVsbG8h', 'base64url').toString()
// → "Hello!"

// Decode a JWT payload
const jwt = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0...'
const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64url').toString())
// → { sub: "1234567890" }
Python
import base64

# Encode to Base64url (no padding)
encoded = base64.urlsafe_b64encode(b'Hello!').rstrip(b'=').decode()
# → "SGVsbG8h"

# Decode from Base64url (re-add padding)
def b64url_decode(s: str) -> bytes:
    s += '=' * (4 - len(s) % 4)  # restore padding
    return base64.urlsafe_b64decode(s)

b64url_decode('SGVsbG8h')  # → b'Hello!'
Go
package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    // Encode to Base64url (no padding)
    encoded := base64.RawURLEncoding.EncodeToString([]byte("Hello!"))
    fmt.Println(encoded) // → "SGVsbG8h"

    // Decode from Base64url
    decoded, _ := base64.RawURLEncoding.DecodeString("SGVsbG8h")
    fmt.Println(string(decoded)) // → "Hello!"
}

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

В чём разница между Base64 и Base64url?
Base64url заменяет + на - и / на _ из стандартного алфавита Base64, а также убирает символы набивки = в конце. Это делает вывод безопасным для использования в URL, параметрах запроса, именах файлов и HTTP-заголовках без дополнительного кодирования. Базовый алгоритм (разбиение байт на 6-битные группы с маппингом на ASCII-символы) идентичен. На практике строки Base64url можно вставлять непосредственно в URL и HTTP-заголовки без изменений, тогда как строки стандартного Base64 в этих контекстах требуют процентного кодирования (%2B для + и %2F для /).
Почему JWT-токены используют Base64url, а не стандартный Base64?
JWT часто передаются в параметрах запроса URL и HTTP-заголовках Authorization. Символы + и / стандартного Base64 потребовали бы процентного кодирования в URL, увеличивая длину и нарушая простые сравнения строк. Спецификация JWT (RFC 7519) предписывает Base64url без набивки, чтобы токены были компактными и URL-безопасными по умолчанию.
Как преобразовать стандартный Base64 в Base64url?
Замените каждый + на -, каждый / на _ и удалите все символы = в конце. В JavaScript: base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''). В Python: base64.urlsafe_b64encode(data).rstrip(b'='). Большинство современных языков также предоставляют специальную функцию кодирования Base64url. Такое преобразование часто требуется при интеграции устаревших библиотек, выдающих стандартный Base64, с современными системами, ожидающими Base64url, — например, JWT-валидаторами, серверами OAuth 2.0 и проверяющими сторонами WebAuthn.
Является ли кодирование Base64url обратимым?
Да, Base64url полностью обратим. Для декодирования замените - на + и _ на /, добавьте символы набивки = до кратности длины 4, затем декодируйте как стандартный Base64. Декодированный вывод побайтово идентичен исходным входным данным.
Можно ли использовать Base64url для шифрования данных?
Нет. Base64url — это кодирование, а не шифрование. Оно преобразует бинарные данные в текстовый формат без какой-либо секретности — любой может его декодировать. Если нужно защитить данные, сначала зашифруйте их надлежащим алгоритмом (AES, ChaCha20), а затем закодируйте шифротекст в Base64url для передачи.
Почему в Base64url опускается набивка?
Символы набивки (=) не нужны, когда декодировщик может вычислить количество недостающих байт из длины строки: (4 - length % 4) % 4 даёт необходимую набивку. Убирание набивки делает строку короче и избавляет от символов =, которые потребовали бы процентного кодирования в URL. RFC 4648, раздел 5 явно разрешает опускать набивку в Base64url.
Как обрабатывать строки Base64url с набивкой в коде?
Некоторые системы создают строки Base64url с символами набивки =. Большинство декодировщиков обрабатывают это корректно. Если ваш декодировщик этого не делает, удалите символы = перед декодированием. Обратно, если библиотека требует набивку, вычислите и добавьте её: const padded = str + '='.repeat((4 - str.length % 4) % 4). Это работает, поскольку количество символов набивки детерминировано исходя из длины строки.