Base64 URL-safe

Кодування та декодування URL-безпечного 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, значення викликів WebAuthn і багато схем API-токенів також покладаються на Base64url. Розуміння цього кодування є необхідним для будь-якого розробника, який працює з автентифікацією, авторизацією або криптографічним обміном даними.

Чому варто використовувати цей інструмент Base64url?

Конвертуйте між Base64url і текстом або двійковими даними безпосередньо у браузері. Підтримується як кодування, так і декодування — з автоматичною обробкою заповнення та замінами символів. Незалежно від того, чи налагоджуєте ви JWT-токен, генеруєте код-виклик PKCE або будуєте 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 (заголовок, корисне навантаження) для перевірки claims, термінів дії та алгоритмів підпису без імпорту JWT-бібліотеки чи верифікації підпису.
Потік OAuth 2.0 PKCE
Генеруйте та перевіряйте значення code_verifier і code_challenge для PKCE. Метод code_challenge_method S256 вимагає SHA-256-хешу code_verifier, закодованого у Base64url.
Інтеграція WebAuthn / FIDO2
Виклики WebAuthn, ідентифікатори облікових даних і дані атестації передаються у вигляді рядків Base64url між браузером і сервером довіряючої сторони. Декодуйте їх для налагодження реєстрації та аутентифікаційних потоків.
Генерація API-токенів
Створюйте URL-безпечні токени з випадкових байтів для посилань скидання пароля, підтвердження email та ідентифікаторів сесій. Base64url створює компактні рядки, які працюють у URL без екранування.
Конвеєри DevOps і CI/CD
Зберігайте двійкові значення конфігурації (сертифікати, ключі) у вигляді рядків Base64url у змінних середовища або YAML-файлах. На відміну від стандартного Base64, вивід не містить символів, які конфліктують із розширенням shell або синтаксисом 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-безпечному варіанті:

Вхідні даніСтандартний 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.
Чи є кодування 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). Це працює, оскільки кількість символів заповнення є детермінованою з довжини рядка.