Как перевести Base64 в Base64URL
- Вставьте Base64 в поле Ввод · Base64. Переносы строк из Base64 с разбивкой и префикс
data:...;base64,удаляются автоматически. - URL-safe строка появится в поле Результат · Base64URL.
- Если получателю нужно
=в конце, отметьте Дополнение (=) под результатом. - Нажмите Скопировать результат. Переключатель Base64URL → Base64 или страница Base64URL в Base64 переводят обратно.
Инструмент декодирует ввод в байты и кодирует их заново. Поэтому некорректный Base64 даёт ошибку, а наполовину преобразованного результата не бывает.
Примеры
| Base64 | Base64URL | Примечание |
|---|---|---|
PDw/Pz8+Pg== | PDw_Pz8-Pg | / и + заменены, == удалено |
eyJyb2xlIjoiYWRtaW4+In0= | eyJyb2xlIjoiYWRtaW4-In0 | JSON с символом >, удалён один = |
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw+cM= | E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM | challenge PKCE из приложения B к RFC 7636 |
+/8= | -_8 | байты fb ff |
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | без изменений: нет +, / и = |
Последний случай встречается часто. Короткий JSON и ASCII-текст нередко кодируются без + и /, а если длина кратна 3 байтам, то и без дополнения, и тогда оба варианта совпадают. Поэтому забытое преобразование может не проявиться на тестах, пока какое-нибудь значение случайно не даст + или /.
Почему URL нужен другой алфавит
Три символа стандартного Base64 имеют в URL особый смысл:
+в строке запроса означает пробел, поэтому?t=a+bво многих фреймворках приходит какa b./разделяет сегменты пути, так что Base64 в пути может разрезаться на части или попасть не в тот маршрут.=отделяет имя параметра запроса от значения, и для надёжности его нужно записывать как%3D.
Раздел 5 RFC 4648 определяет Base64URL как раз для этого: - и _ заменяют + и /, а дополнение можно опустить. Такие значения безопасны в путях, строках запроса, cookie и именах файлов без всякого экранирования. Подробности в статье Base64 и Base64URL.
Где обязателен Base64URL
- JWT и JWS. Каждый сегмент JSON Web Token записан в Base64URL без дополнения. Их читает декодер JWT, а формат объясняется в статье Base64 в JWT.
- OAuth PKCE.
code_challengeполучают как Base64URL от дайджеста SHA-256 строки verifier, без дополнения. Инструменты хеширования часто выдают стандартный Base64, так что это преобразование остаётся последним шагом. - WebAuthn и JWK. ID учётных данных, challenge и параметры ключа в JSON Web Key записываются в Base64URL.
- Подписанные URL и токены в ссылках, например в ссылках для сброса пароля или скачивания, где значение стоит в пути или строке запроса.
Чтобы закодировать текст сразу в Base64URL, минуя стандартный вариант, используйте кодировщик Base64URL.
Base64 в Base64URL в коде
import base64
base64.urlsafe_b64encode(b"<<???>>").rstrip(b"=").decode() # 'PDw_Pz8-Pg'
Buffer.from("PDw/Pz8+Pg==", "base64").toString("base64url"); // 'PDw_Pz8-Pg'
"PDw/Pz8+Pg==".replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); // same, without Buffer
urlsafe_b64encode в Python сохраняет дополнение, отсюда rstrip. Кодировка "base64url" в Node его отбрасывает. Подробнее в руководствах по Python и Node.js.
Вопросы и ответы
Меняются ли данные при переводе в Base64URL?
Нет. Оба алфавита кодируют одни и те же байты, различаются только два символа и дополнение. Декодирование любого из вариантов даёт одинаковые байты.
Оставлять ли дополнение = в Base64URL?
Смотрите, что ждёт получатель. JWT (RFC 7515) и PKCE (RFC 7636) требуют обходиться без дополнения. Некоторые библиотеки принимают оба варианта, а отдельные старые декодеры без него не работают. Для них отметьте Дополнение (=).
Можно ли перевести Base64 в Base64URL регулярным выражением?
Да: в JavaScript это s.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""). Выражение рассчитано на одну чистую строку; если данные пришли из PEM-файла или письма, сначала уберите переносы строк.
Почему бы просто не закодировать стандартный Base64 в percent-encoding?
Так тоже можно, но +, / и = превращаются в %2B, %2F и %3D, по три символа на каждый, а некоторые системы декодируют URL дважды или считают + пробелом. Base64URL избавляет от всего этого.