Como converter Base64URL para Base64
- Cole o Base64URL em Entrada · Base64URL. O preenchimento é opcional, e
+e/padrão na entrada também funcionam. - O Base64 padrão aparece em Saída · Base64, com
-e_trocados por+e/e o preenchimento restaurado. - Abaixo da saída, Preenchimento (=) vem ativado por padrão; Quebra de linha pode quebrar o resultado em 64 caracteres para PEM ou em 76 para MIME.
- Use Copiar saída. O botão Base64 → Base64URL, ou a página Base64 para Base64URL, faz o caminho inverso.
Quanto preenchimento adicionar
O Base64 trabalha em grupos de 4 caracteres. O Base64URL geralmente omite os sinais = que completam o último grupo, então o comprimento diz quantos devolver:
| Comprimento mod 4 | Preenchimento a adicionar | Exemplo |
|---|---|---|
| 0 | nenhum | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 (36 caracteres) |
| 2 | == | PDw_Pz8-Pg (10) vira PDw/Pz8+Pg== |
| 3 | = | eyJyb2xlIjoiYWRtaW4-In0 (23) vira eyJyb2xlIjoiYWRtaW4+In0= |
| 1 | inválido | um único caractere que sobra não comporta um byte inteiro |
O conhecido payload de exemplo eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ tem 70 caracteres, resto 2, então vira a mesma string com == no final. O guia de preenchimento traz o raciocínio completo.
Por que você pode precisar de Base64 padrão
Muitos decodificadores aceitam só o alfabeto padrão, e cada um falha de um jeito quando recebe Base64URL:
- O
base64 -ddo GNU coreutils imprime o que conseguiu decodificar até o primeiro-ou_e depoisbase64: invalid input. - O
Base64.getDecoder()do Java lançaIllegalArgumentException; para entrada URL-safe, o certo éBase64.getUrlDecoder(). - O
Convert.FromBase64Stringdo .NET lançaFormatExceptiondiante de-,_ou de um=ausente. - O
base64.b64decodedo Python é o perigoso: por padrão, descarta caracteres fora do alfabeto padrão sem erro nenhum.b64decode("PDw_Pz8-Pg==")devolveb'<<\x0f\xcf\xc3\xe0'em vez deb'<<???>>'.
O último caso merece um teste em qualquer código que lide com tokens. Bytes errados sem exceção costumam aparecer bem mais tarde, como uma verificação de assinatura que falha ou dados corrompidos.
Base64URL para Base64 no código
import base64
def b64url_to_bytes(s: str) -> bytes:
return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
b64url_to_bytes("PDw_Pz8-Pg") # b'<<???>>'
base64.b64encode(b64url_to_bytes("PDw_Pz8-Pg")).decode() # 'PDw/Pz8+Pg=='
-len(s) % 4 é o número de sinais = que faltam: 0, 1 ou 2 para entrada válida. O urlsafe_b64decode exige o preenchimento, por isso ele é adicionado antes da chamada.
function b64urlToB64(s) {
const b = s.replace(/-/g, "+").replace(/_/g, "/");
return b + "=".repeat((4 - (b.length % 4)) % 4);
}
b64urlToB64("PDw_Pz8-Pg"); // 'PDw/Pz8+Pg=='
No Node.js, Buffer.from(s, "base64url").toString("base64") faz o mesmo em uma chamada. Veja as páginas de Python, Java e C# para os decodificadores URL-safe de cada biblioteca padrão.
Problemas comuns
- “o último grupo de caracteres está incompleto”. O comprimento deixa resto 1. Parte da string se perdeu, muitas vezes em uma quebra de linha ou porque uma URL foi truncada.
- Um
.na entrada. JWTs juntam três segmentos Base64URL com pontos. Converta um segmento de cada vez; o decodificador de JWT aceita o token inteiro. %3Dna string. O valor recebeu codificação percentual por cima do Base64URL. Decodifique antes com o decodificador de URL.
Perguntas frequentes
Como adicionar de volta o preenchimento ao Base64URL?
Complete o final com = até chegar a um múltiplo de 4 caracteres: dois sinais para resto 2, um para resto 3. Resto 1 não acontece em dados válidos. Este conversor faz isso por você.
Por que o base64 -d falha em um JWT?
O base64 -d do GNU só conhece o alfabeto padrão e para com invalid input no primeiro - ou _. Converta o segmento aqui antes ou use basenc --base64url -d, que lê o alfabeto URL-safe.
E se a string tiver um caractere a mais?
Uma string Base64URL cujo comprimento deixa resto 1 na divisão por 4 foi cortada ou tem um caractere sobrando. O conversor informa que o último grupo está incompleto; confira como o valor foi copiado.
Preciso de Base64 padrão para ler um JWT?
Não neste site: o decodificador de JWT e o decodificador Base64URL leem Base64URL diretamente. Converta para Base64 padrão quando outra ferramenta ou biblioteca só aceitar essa forma.