Como converter Base64 para Base64URL
- Cole o Base64 em Entrada · Base64. Quebras de linha de Base64 quebrado e um prefixo
data:...;base64,são removidos automaticamente. - A string URL-safe aparece em Saída · Base64URL.
- Marque Preenchimento (=) abaixo da saída se o destinatário quiser o
=final. - Use Copiar saída. O seletor Base64URL → Base64, ou Base64URL para Base64, converte de volta.
A entrada é decodificada para bytes e recodificada, então uma string que não é Base64 válido recebe um erro em vez de um resultado convertido pela metade.
Exemplos
| Base64 | Base64URL | Observação |
|---|---|---|
PDw/Pz8+Pg== | PDw_Pz8-Pg | / e + trocados, == removido |
eyJyb2xlIjoiYWRtaW4+In0= | eyJyb2xlIjoiYWRtaW4-In0 | JSON com um >, um = removido |
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw+cM= | E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM | o desafio PKCE da RFC 7636, Apêndice B |
+/8= | -_8 | os bytes fb ff |
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | sem mudança: não tem +, / nem = |
A última linha é comum. JSON curto e texto ASCII muitas vezes codificam sem + ou /, e quando o comprimento é múltiplo de 3 bytes também não há preenchimento, então as duas formas são idênticas. É por isso também que uma conversão esquecida pode passar despercebida nos testes até algum valor gerar por acaso um + ou /.
Caracteres do Base64 padrão que quebram URLs
Três caracteres do Base64 padrão têm significado especial em URLs:
+significa espaço em query strings, então?t=a+bchega comoa bem muitos frameworks./separa segmentos do caminho, então Base64 num caminho pode ser dividido ou roteado errado.=separa o nome do parâmetro de query do valor e precisa ser escrito como%3Dpara ficar seguro.
A seção 5 da RFC 4648 define o Base64URL para esse caso, com - e _ no lugar de + e / e um preenchimento que pode ser omitido. Valores assim dispensam escape em caminhos, query strings, cookies e nomes de arquivo. O artigo Base64 vs Base64URL traz os detalhes.
Onde o Base64URL é obrigatório
- JWT e JWS. Os três segmentos de um JSON Web Token usam Base64URL sem preenchimento. O decodificador de JWT lê esses segmentos, e Base64 no JWT explica o formato.
- PKCE do OAuth. Ferramentas de hash muitas vezes imprimem o digest SHA-256 do verifier em Base64 padrão, enquanto o
code_challengeprecisa ser esse digest em Base64URL sem preenchimento. Esta conversão é o último passo. - WebAuthn e JWK. IDs de credencial, desafios e os parâmetros de chave de um JSON Web Key são Base64URL.
- URLs assinadas e tokens em links, como links de redefinição de senha ou de download, em que o valor fica num caminho ou numa query string.
Para codificar texto direto em Base64URL, sem passar pela forma padrão, use o codificador Base64URL.
Base64 para Base64URL no código
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
O urlsafe_b64encode do Python mantém o preenchimento, daí o rstrip. A codificação "base64url" do Node o remove. Mais nos guias de Python e Node.js.
Perguntas frequentes
Converter para Base64URL altera os dados?
Não. Os dois alfabetos codificam os mesmos bytes; só dois caracteres e o preenchimento mudam. Decodificar qualquer das duas formas dá bytes idênticos.
Na conversão, o preenchimento = sai?
Siga o que o destinatário pede. JWTs (RFC 7515) e PKCE (RFC 7636) exigem que não haja preenchimento. Algumas bibliotecas aceitam as duas formas, e alguns decodificadores mais antigos fazem questão dele; nesse caso, marque Preenchimento (=).
Dá para converter Base64 em Base64URL com uma regex?
Dá: s.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "") em JavaScript. Isso supõe que a entrada é uma única linha limpa; remova as quebras de linha antes se ela veio de um arquivo PEM ou de um e-mail.
Aplicar codificação percentual ao Base64 padrão é uma alternativa?
Funciona, mas +, / e = viram %2B, %2F e %3D, três caracteres cada, e o valor continua quebrando em sistemas que decodificam a URL duas vezes ou leem + como espaço. O Base64URL não tem nenhum desses problemas.