Como codificar em Base64URL
- Digite ou cole o texto em Entrada · texto.
- Copie o Base64URL de Saída · Base64. URL-safe (- _) e Sem preenchimento (=) já vêm marcados nesta página.
- Se o destino quiser preenchimento, desmarque Sem preenchimento (=). Se quiser Base64 padrão, desmarque também URL-safe ou use o codificador Base64.
- Copie a saída ou baixe como
base64.txt.
Decodifique um valor com o decodificador Base64URL; para converter strings existentes entre os dois alfabetos, use Base64 para Base64URL.
O que muda em relação ao Base64 padrão
Só três caracteres mudam. Todo o resto, incluindo a regra de 3 bytes para 4 caracteres, continua igual:
| Base64 padrão | Base64URL | |
|---|---|---|
| Valor 62 | + | - |
| Valor 63 | / | _ |
| Preenchimento | = obrigatório | geralmente omitido |
| Definido em | RFC 4648, seção 4 | RFC 4648, seção 5 |
Em muitas strings curtas, as duas variantes diferem só no preenchimento. A diferença de alfabeto aparece sempre que um grupo de 6 bits tem valor 62 ou 63, o que acontece com caracteres como ? e > e com muitos bytes não ASCII:
| Entrada | Padrão | Base64URL, sem preenchimento |
|---|---|---|
Hi! | SGkh | SGkh |
?>?> | Pz4/Pg== | Pz4_Pg |
subjects?_d | c3ViamVjdHM/X2Q= | c3ViamVjdHM_X2Q |
https://example.com/?q=1 | aHR0cHM6Ly9leGFtcGxlLmNvbS8/cT0x | aHR0cHM6Ly9leGFtcGxlLmNvbS8_cT0x |
Base64 vs Base64URL aprofunda o histórico e as diferenças na decodificação.
Por que URLs precisam de um alfabeto próprio
Cada um dos três caracteres padrão tem significado em uma URL. A / separa segmentos do caminho, o = separa nomes de valores em uma query string, e o + é lido como espaço pelos decodificadores de formulário. Um valor Base64 padrão como a+b/c== em um parâmetro de query chega como a b/c==, a menos que cada caractere tenha recebido escape. A codificação percentual resolve, mas transforma cada um deles em três caracteres (%2B, %2F, %3D).
O Base64URL escolhe dois caracteres não reservados em URLs e descarta o preenchimento, então o valor pode ir sem alteração para um caminho, uma query string, um fragmento, um cookie ou um nome de arquivo. - e _ também são seguros em nomes de arquivo em todos os sistemas de arquivos comuns, ao contrário da /.
Onde o Base64URL é usado
- JWT e JOSE. Todas as partes de um JSON Web Token são Base64URL sem preenchimento, conforme a RFC 7515. O decodificador de JWT lê tokens; Base64 em JWT explica a estrutura.
- PKCE do OAuth. O
code_challengeé o Base64URL do hash SHA-256 docode_verifier. - WebAuthn e passkeys. IDs de credenciais e challenges trafegam como Base64URL dentro de JSON.
- Links e IDs. Links de compartilhamento, parâmetros de URL assinados e IDs curtos feitos de bytes aleatórios usam Base64URL para manter a URL limpa.
Base64URL no código
O Node.js tem a codificação base64url embutida, e o Python uma função URL-safe da qual você mesmo remove o preenchimento:
// 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'
Mais em Base64 no Node.js, JavaScript e Python, e a API do navegador em Uint8Array.toBase64.
Perguntas frequentes
O que é Base64URL?
A variante do Base64 segura para URLs e nomes de arquivo, definida na seção 5 da RFC 4648. Ela usa - e _ como os dois últimos caracteres do alfabeto, no lugar de + e /, e costuma ser escrita sem o preenchimento =.
Por que não aplicar codificação percentual ao Base64 normal?
Funciona, mas custa três caracteres para cada +, / e =, e um escape esquecido transforma + em espaço quando a query string é analisada. O Base64URL evita os dois problemas.
Devo manter o preenchimento =?
O JWT e a maioria dos formatos URL-safe o omitem, porque o = também precisa de escape em URLs e o decodificador consegue deduzir o preenchimento pelo comprimento. Mantenha só se o sistema de destino exigir: desmarque Sem preenchimento.
Como gerar um code_challenge do PKCE?
Calcule o hash SHA-256 do code_verifier e codifique os 32 bytes do hash em Base64URL sem preenchimento. Esta página codifica texto, não bytes de hash, então faça isso no código; o trecho abaixo reproduz o exemplo da RFC 7636.