Как закодировать в Base64URL
- Введите или вставьте текст в поле Ввод · текст.
- Скопируйте Base64URL из поля Результат · Base64. Флажки URL-safe (- _) и Без дополнения (=) на этой странице уже стоят.
- Если получателю нужно дополнение, снимите Без дополнения (=). Если нужен стандартный Base64, снимите ещё и URL-safe (- _) или воспользуйтесь кодировщиком Base64.
- Скопируйте результат или скачайте его как
base64.txt.
Декодировать значение можно декодером Base64URL, а для перевода готовых строк между двумя алфавитами есть страница Base64 в Base64URL.
Чем он отличается от стандартного Base64
Различаются только три символа. Всё остальное, включая правило «3 байта – 4 символа», не меняется:
| Стандартный Base64 | Base64URL | |
|---|---|---|
| Значение 62 | + | - |
| Значение 63 | / | _ |
| Дополнение | = обязательно | обычно опускается |
| Где описан | RFC 4648, раздел 4 | RFC 4648, раздел 5 |
У многих коротких строк варианты отличаются только дополнением. Разница в алфавите проявляется, когда 6-битная группа принимает значение 62 или 63, а это дают символы вроде ? и > и многие байты вне ASCII:
| Вход | Стандартный | Base64URL без дополнения |
|---|---|---|
Hi! | SGkh | SGkh |
?>?> | Pz4/Pg== | Pz4_Pg |
subjects?_d | c3ViamVjdHM/X2Q= | c3ViamVjdHM_X2Q |
https://example.com/?q=1 | aHR0cHM6Ly9leGFtcGxlLmNvbS8/cT0x | aHR0cHM6Ly9leGFtcGxlLmNvbS8_cT0x |
История и различия при декодировании подробнее разобраны в статье Base64 и Base64URL.
Зачем URL свой алфавит
Каждый из трёх стандартных символов что-то значит в URL. / разделяет сегменты пути, = отделяет имена от значений в query-строке, а + декодеры форм читают как пробел. Стандартное значение Base64 вроде a+b/c== в параметре запроса придёт как a b/c==, если не экранировать каждый символ. Percent-encoding это лечит, но превращает каждый из них в три символа (%2B, %2F, %3D).
Base64URL берёт два символа, которые в URL не зарезервированы, и отбрасывает дополнение, так что значение можно без изменений вставить в путь, query-строку, фрагмент, cookie или имя файла. - и _, в отличие от /, безопасны и в именах файлов на всех распространённых файловых системах.
Где используется Base64URL
- JWT и JOSE. По RFC 7515 каждая часть JSON Web Token кодируется в Base64URL без дополнения. Токены читает декодер JWT, а структуру объясняет статья Base64 в JWT.
- OAuth PKCE.
code_challengeсодержит SHA-256-хешcode_verifierв Base64URL. - WebAuthn и passkeys. ID учётных данных и challenge передаются в JSON как Base64URL.
- Ссылки и ID. Ссылки «поделиться», подписанные параметры URL и короткие ID из случайных байтов используют его, чтобы не требовать экранирования в URL.
Base64URL в коде
В Node.js есть встроенная кодировка base64url, а в Python есть URL-safe функция, но дополнение у её результата нужно отрезать самостоятельно:
// Node.js
Buffer.from("subjects?_d").toString("base64url"); // "c3ViamVjdHM_X2Q"
// Browsers with Uint8Array.prototype.toBase64
new TextEncoder().encode("subjects?_d").toBase64({ alphabet: "base64url", omitPadding: true });
import base64, hashlib
base64.urlsafe_b64encode(b"subjects?_d").rstrip(b"=").decode() # 'c3ViamVjdHM_X2Q'
# PKCE code_challenge, example from RFC 7636 appendix B
verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
digest = hashlib.sha256(verifier.encode("ascii")).digest()
base64.urlsafe_b64encode(digest).rstrip(b"=").decode()
# 'E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM'
Подробнее в статьях Base64 в Node.js, JavaScript и Python, а браузерный API описан в статье Uint8Array.toBase64.
Вопросы и ответы
Что такое Base64URL?
Вариант Base64, безопасный для URL и имён файлов, из раздела 5 RFC 4648. Последние два символа его алфавита заменены: - и _ вместо + и /, а дополнение = обычно не пишут.
Чем Base64URL удобнее percent-кодирования обычного Base64?
После percent-кодирования каждый +, / и = занимает три символа, а если экранирование забыли, + при разборе query-строки станет пробелом. В Base64URL нет + и /, а дополнение обычно опускают.
Оставлять ли дополнение =?
JWT и большинство URL-safe форматов его опускают: = в URL тоже приходится экранировать, а декодер и так вычисляет дополнение по длине. Оставляйте его, только если этого требует принимающая система; в таком случае снимите флажок Без дополнения (=).
Как сделать code_challenge для PKCE?
Захешируйте code_verifier через SHA-256 и закодируйте 32 байта хеша в Base64URL без дополнения. Эта страница кодирует текст, а не байты хеша, поэтому делайте это в коде; фрагмент ниже воспроизводит пример из RFC 7636.