Koder/Dekoder Base64URL

Koduj i dekoduj Base64 bezpieczny dla URL (Base64url)

Zwykły tekst

Base64

Działa lokalnie · Bezpieczne do wklejania sekretów
Wynik Base64...

Czym jest kodowanie Base64url?

Base64url to wariant kodowania Base64 zaprojektowany z myślą o użyciu w adresach URL, nazwach plików i innych kontekstach, gdzie standardowe znaki Base64 + i / powodują problemy. Zdefiniowany w RFC 4648 Sekcja 5, Base64url zastępuje + przez - (myślnik) i / przez _ (podkreślenie), pomijając końcowe znaki dopełnienia =. Wynikiem jest ciąg, który można osadzić bezpośrednio w parametrze zapytania URL, nazwie pliku lub nagłówku HTTP bez konieczności dodatkowego kodowania procentowego.

Standardowy Base64 (RFC 4648 Sekcja 4) używa 64 znaków: A-Z, a-z, 0-9, + i /. Znaki + i / są zarezerwowane w adresach URL: + jest interpretowany jako spacja w ciągach zapytań (application/x-www-form-urlencoded), a / jest separatorem ścieżki. Użycie standardowego Base64 wewnątrz adresu URL wymaga zatem kodowania procentowego tych znaków (%2B, %2F), co zwiększa długość ciągu i utrudnia jego czytelność. Base64url całkowicie eliminuje ten problem, używając od początku znaków bezpiecznych dla URL.

Najbardziej rozpowszechnione zastosowanie Base64url to JSON Web Tokeny (JWT). Wszystkie trzy segmenty JWT — nagłówek, ładunek i podpis — są kodowane w Base64url. Weryfikatory PKCE OAuth 2.0, wartości challenge WebAuthn oraz wiele schematów tokenów API również opiera się na Base64url. Zrozumienie tego kodowania jest niezbędne dla każdego programisty pracującego z uwierzytelnianiem, autoryzacją lub kryptograficzną wymianą danych.

Dlaczego warto używać tego narzędzia Base64url?

Konwertuj między Base64url a tekstem lub danymi binarnymi bezpośrednio w przeglądarce. Obsługiwane jest zarówno kodowanie, jak i dekodowanie, z automatyczną obsługą dopełnienia i zamiany znaków. Niezależnie od tego, czy debugujesz token JWT, generujesz kod challenge PKCE, czy budujesz identyfikatory bezpieczne dla URL, narzędzie to przetwarza wszystko lokalnie w Twojej przeglądarce bez żadnych opóźnień i bez potrzeby komunikacji z serwerem.

Natychmiastowa konwersja
Wynik aktualizuje się w trakcie wpisywania. Koduj tekst do Base64url lub dekoduj Base64url z powrotem do tekstu bez żadnego opóźnienia — bez przesyłania formularzy ani przeładowywania strony.
🔗
Wynik bezpieczny dla URL
Wynik używa wyłącznie znaków bezpiecznych w adresach URL, nazwach plików i nagłówkach HTTP: A-Z, a-z, 0-9, myślnik i podkreślenie. Bez kodowania procentowego.
🔒
Przetwarzanie bez opuszczania przeglądarki
Całe kodowanie i dekodowanie odbywa się lokalnie w Twojej przeglądarce. Tokeny JWT, sekrety OAuth i klucze API, które tutaj wklejasz, nigdy nie są przesyłane na żaden serwer.
🏛️
Zgodność ze standardami
Implementuje dokładnie RFC 4648 Sekcja 5: - i _ zastępują + i /, dopełnienie jest pomijane. Kompatybilny z bibliotekami JWT, OAuth 2.0 PKCE i implementacjami WebAuthn.

Przypadki użycia Base64url

Inspekcja tokenów JWT
Dekoduj poszczególne segmenty JWT (nagłówek, ładunek), aby sprawdzić claims, czasy wygaśnięcia i algorytmy podpisywania — bez importowania biblioteki JWT ani weryfikowania podpisu.
Przepływ OAuth 2.0 PKCE
Generuj i weryfikuj wartości code_verifier i code_challenge PKCE. Metoda code_challenge_method S256 wymaga zakodowanego w Base64url skrótu SHA-256 wartości code_verifier.
Integracja WebAuthn / FIDO2
Dane challenge, credential ID i attestation WebAuthn są przesyłane jako ciągi Base64url między przeglądarką a serwerem strony ufającej. Dekoduj je, aby debugować przepływy rejestracji i uwierzytelniania.
Generowanie tokenów API
Twórz bezpieczne dla URL tokeny z losowych bajtów do linków resetowania hasła, weryfikacji e-mail i identyfikatorów sesji. Base64url generuje zwarte ciągi działające w adresach URL bez konieczności stosowania znaków ucieczki.
DevOps i potoki CI/CD
Przechowuj binarne wartości konfiguracyjne (certyfikaty, klucze) jako ciągi Base64url w zmiennych środowiskowych lub plikach YAML. W przeciwieństwie do standardowego Base64, wynik nie zawiera znaków kolidujących z rozwijaniem powłoki ani składnią YAML.
Inżynieria danych
Koduj binarne identyfikatory, skróty i sumy kontrolne w Base64url do użycia w nazwach plików, kluczach baz danych lub kolumnach CSV, gdzie znaki + i / psułyby parsowanie lub wymagały stosowania znaków ucieczki.

Standardowy Base64 a Base64url

Base64url różni się od standardowego Base64 dokładnie w trzech aspektach. Algorytm kodowania jest identyczny — zmienia się tylko alfabet i obsługa dopełnienia:

CechaStandard (RFC 4648 §4)Base64url (RFC 4648 §5)
Index 62+-
Index 63/_
Padding= (required)Omitted

Te trzy różnice oznaczają, że konwersja między standardowym Base64 a Base64url jest prosta: zastąp + przez -, / przez _ i usuń końcowe znaki =. W odwrotnym kierunku zastąp - przez +, _ przez / i dodaj z powrotem dopełnienie, aby długość była wielokrotnością 4. Większość języków programowania oferuje natywną obsługę Base64url, co sprawia, że ręczna konwersja jest zbędna. Obie konwersje są w pełni odwracalne i bezstratne, zachowując oryginalną sekwencję bajtów w niezmienionej postaci.

Tabela porównawcza kodowania

Poniższa tabela pokazuje te same dane wejściowe zakodowane standardowym Base64 i Base64url. Zwróć uwagę, jak znaki dopełnienia (=) są usuwane, a + i / zastępowane przez - i _ w wariancie bezpiecznym dla URL:

WejścieStandardowy Base64Base64url (bez dopełnienia)
HelloSGVsbG8=SGVsbG8
AQQ==QQ
1+1=2MSsxPTI=MSsxPTI
subject?ref=1c3ViamVjdD9yZWY9MQ==c3ViamVjdD9yZWY9MQ
👍 (thumbs up)8J+RjQ==8J-RjQ

Przykłady kodu

Jak kodować i dekodować ciągi Base64url w popularnych językach programowania. Każdy przykład generuje wynik bezpieczny do użycia w adresach URL, nazwach plików i nagłówkach 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!"
}

Często zadawane pytania

Jaka jest różnica między Base64 a Base64url?
Base64url zastępuje + przez - i / przez _ ze standardowego alfabetu Base64, a także pomija końcowe znaki dopełnienia =. Dzięki temu wynik jest bezpieczny do użycia w adresach URL, parametrach zapytania, nazwach plików i nagłówkach HTTP bez dodatkowego kodowania. Podstawowy algorytm (dzielenie bajtów na 6-bitowe grupy mapowane na znaki ASCII) jest identyczny. W praktyce ciągi Base64url mogą pojawiać się bezpośrednio w adresach URL i nagłówkach HTTP bez żadnych modyfikacji, natomiast standardowe ciągi Base64 wymagają w tych kontekstach kodowania procentowego (%2B dla +, %2F dla /).
Dlaczego tokeny JWT używają Base64url zamiast standardowego Base64?
JWT są często przesyłane w parametrach zapytania URL i nagłówkach HTTP Authorization. Standardowe znaki Base64 + i / musiałyby być kodowane procentowo w adresach URL, co zwiększa długość i psuje proste porównania ciągów. Specyfikacja JWT (RFC 7519) nakazuje stosowanie Base64url bez dopełnienia, aby tokeny były domyślnie zwarte i bezpieczne dla URL.
Jak przekonwertować standardowy Base64 na Base64url?
Zastąp każdy + przez -, każdy / przez _ i usuń wszystkie końcowe znaki =. W JavaScript: base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''). W Python: base64.urlsafe_b64encode(data).rstrip(b'='). Większość nowoczesnych języków oferuje też dedykowaną funkcję kodowania Base64url. Ta konwersja jest często niezbędna podczas integracji starszych bibliotek generujących standardowy Base64 z nowoczesnymi systemami oczekującymi formatu Base64url.
Czy kodowanie Base64url jest odwracalne?
Tak, Base64url jest w pełni odwracalne. Aby zdekodować, zastąp - przez + i _ przez /, dodaj z powrotem znaki dopełnienia =, aby długość była wielokrotnością 4, a następnie zdekoduj jako standardowy Base64. Zdekodowany wynik jest bajt po bajcie identyczny z oryginalnym wejściem.
Czy mogę używać Base64url do szyfrowania danych?
Nie. Base64url to kodowanie, nie szyfrowanie. Przekształca dane binarne w format bezpieczny dla tekstu bez jakiegokolwiek zabezpieczenia — każdy może je zdekodować. Jeśli potrzebujesz chronić dane, najpierw zaszyfruj je odpowiednim algorytmem (AES, ChaCha20), a następnie zakoduj szyfrogramy w Base64url do transportu.
Dlaczego dopełnienie jest pomijane w Base64url?
Znaki dopełnienia (=) nie mają żadnego celu, gdy dekoder może obliczyć brakującą liczbę bajtów na podstawie długości ciągu: (4 - length % 4) % 4 podaje wymagane dopełnienie. Pominięcie dopełnienia skraca ciąg i eliminuje znaki =, które wymagałyby kodowania procentowego w adresach URL. RFC 4648 Sekcja 5 jawnie zezwala na pomijanie dopełnienia w Base64url.
Jak obsługiwać ciągi Base64url z dopełnieniem w kodzie?
Niektóre systemy generują ciągi Base64url zachowujące dopełnienie =. Większość dekoderów obsługuje to poprawnie. Jeśli Twój nie radzi sobie z tym, usuń końcowe = przed dekodowaniem. Z drugiej strony, jeśli biblioteka wymaga dopełnienia, oblicz je i dołącz: const padded = str + '='.repeat((4 - str.length % 4) % 4). Działa to dlatego, że liczba znaków dopełnienia jest deterministyczna na podstawie długości ciągu.