Desenvolvimento

Codificador e decodificador de Base64

Cole o texto de um lado e receba o Base64 do outro. Acentos e emoji sobrevivem à ida e à volta, o que é mais do que o btoa() do console faz por você. Nada é enviado a lugar nenhum: a conversão acontece nesta aba.

A variante segura para URL troca os dois caracteres que quebram dentro de uma query string e descarta o preenchimento =. Na decodificação, os dois alfabetos são aceitos.

Afeta apenas a codificação. As quebras de linha são removidas antes de decodificar.

0Bytes de entrada
0Caracteres Base64
0%Mudança de tamanho

O que o Base64 faz de verdade

O Base64 reescreve bytes arbitrários usando apenas 64 caracteres que sobrevivem à passagem por sistemas que esperam texto. Ele pega três bytes — 24 bits — e os divide em quatro grupos de seis bits. Seis bits guardam um número de 0 a 63, e cada número corresponde a um caractere. Entram três bytes, saem quatro caracteres, sempre.

Essa proporção é toda a história do custo: a saída em Base64 é um terço maior que a entrada, antes de qualquer quebra de linha. Quando o comprimento da entrada não é múltiplo de três, o codificador preenche o último grupo e o marca com sinais =: um quando sobram dois bytes, dois quando sobra um byte. É por isso que tantas strings Base64 terminam em = ou ==, e por isso nenhuma jamais termina em três.

Dois alfabetos, e o bug que nasce de misturá-los

O alfabeto padrão do RFC 4648 é A–Z, a–z, 0–9, mais + e /. Esses dois últimos são hostis dentro de uma URL: + é lido como espaço em dados codificados de formulário, e / encerra um segmento do caminho. Por isso o mesmo RFC define um segundo alfabeto, o base64url, que os substitui por - e _ e normalmente descarta o preenchimento, já que = também precisa de escape.

Os JSON Web Tokens usam base64url. A maioria dos cookies assinados e muitos identificadores de API também. Se um token decodifica como lixo em uma biblioteca e funciona em outra, o alfabeto é a primeira coisa a verificar: os dois não são intercambiáveis, embora pareçam quase idênticos. O decodificador desta página aceita os dois e os normaliza, o que é conveniente mas também significa que ele vai ler sem reclamar uma entrada que uma biblioteca rigorosa recusaria.

Por que o btoa() quebra na palavra "café"

O btoa() embutido no navegador não recebe texto. Ele recebe uma string binária, ou seja, cada caractere precisa caber em um byte. Qualquer coisa acima de U+00FF lança InvalidCharacterError, e é por isso que caracteres acentuados e emoji falham enquanto o inglês simples não falha — um bug que sobrevive aos testes e depois aparece em produção na primeira vez que alguém digita o próprio nome.

A correção é converter o texto para bytes UTF-8 antes e entregar esses bytes ao btoa(). Esta ferramenta faz isso com TextEncoder, então a saída dela bate exatamente com base64.b64encode(s.encode("utf-8")) do Python e com Buffer.from(s, "utf8").toString("base64") do Node. Isso também significa que a contagem de bytes nas estatísticas acima não é a contagem de caracteres: um caractere latino acentuado são dois bytes, e a maioria dos emoji são quatro.

Base64 não é criptografia

Não tem chave nem segredo. Qualquer pessoa que veja a string pode revertê-la em um segundo, usando esta mesma página. Uma senha guardada em Base64 em um arquivo de configuração é uma senha em texto puro fantasiada. O mesmo vale para o conteúdo de um JWT: ele é assinado, não escondido, e quem tiver o token consegue ler cada claim lá dentro.

Também não é compressão. Codificar um zip em Base64 deixa o arquivo maior, não menor.

Onde esta ferramenta para

A questão da quebra de linha

O MIME, o padrão por trás dos anexos de e-mail, limita as linhas a 76 caracteres. O PEM, o formato que guarda certificados e chaves privadas, quebra em 64. Os dois existem porque os servidores de e-mail antigos estragavam linhas longas. Os decodificadores deveriam ignorar as quebras de linha, e quase todos ignoram — mas alguns parsers rigorosos, principalmente em sistemas embarcados e corporativos antigos, não. Se um bloco Base64 copiado de um e-mail falha ao decodificar em algum lugar, as quebras de linha rígidas são as culpadas de sempre.

Perguntas frequentes

Por que meu texto acentuado quebra no btoa() mas funciona aqui?

O btoa() só aceita caracteres abaixo de U+0100, então qualquer coisa com acento ou emoji lança InvalidCharacterError. Esta ferramenta converte seu texto para bytes UTF-8 antes e codifica esses bytes, que é o que Python e Node fazem por padrão.

Qual é a diferença entre Base64 e base64url?

Os dois últimos caracteres do alfabeto. O Base64 padrão usa + e /, o base64url usa - e _, e o base64url normalmente não tem preenchimento =. JWTs e a maioria dos tokens embutidos em URLs usam base64url. O resto da codificação é idêntico.

Base64 é seguro?

Não. É uma codificação, não criptografia: não há chave e qualquer pessoa reverte na hora. Use para mover bytes por canais que só aceitam texto, nunca para esconder alguma coisa.

Por que minha string Base64 termina com sinais =?

Porque o comprimento da entrada não era múltiplo de três. Um = no final significa que o último grupo tinha dois bytes; dois = significam que tinha um. Uma string nunca termina com três caracteres de preenchimento.

Dá para decodificar uma string sem o preenchimento?

Dá. O decodificador desta página repõe o preenchimento antes de decodificar. Muitas bibliotecas rigorosas não fazem isso, e essa é a causa mais comum de um token base64url falhar em outro lugar e funcionar aqui.

Última atualização 19 de setembro de 2026