O Que É Codificação Base64? Como Funciona e Onde É Usada
Base64 é um jeito de representar qualquer dado binário ou texto usando apenas 64 caracteres ASCII imprimíveis (A-Z, a-z, 0-9, + e /, mais o = como preenchimento). Ela existe para que dados que não são texto puro consigam atravessar sistemas que só lidam com texto de forma segura, como cabeçalhos HTTP, JSON e e-mail. Cada 3 bytes de entrada viram exatamente 4 caracteres de saída, o que deixa o resultado cerca de 33% maior que o original.
O que a codificação Base64 realmente faz
Base64 não é criptografia e não é compressão. Não existe chave secreta, qualquer pessoa com um decodificador (inclusive o widget logo abaixo) reverte o processo em milissegundos, e o resultado é sempre maior que a entrada, nunca menor. Isso é o oposto do que a maioria espera de uma “codificação”.
Esse ponto merece destaque porque é o erro mais comum que se vê por aí: alguém pega uma senha, um token ou um dado sensível, converte para Base64 e trata isso como se tivesse “protegido” a informação. Não protegeu. Base64 apenas muda a representação dos bytes, não esconde nada de quem sabe decodificar, e decodificar não exige senha nem chave, só um decodificador comum. Se o objetivo é segurança, o que se precisa é de criptografia de verdade (AES, por exemplo), não Base64.
Como funciona: codificando “Man” bit a bit
A melhor forma de entender Base64 é ver os bits se movendo. Vamos codificar o texto “Man”.
Cada caractere tem um valor ASCII, e cada valor ASCII é um byte de 8 bits:
- M = 77 =
01001101 - a = 97 =
01100001 - n = 110 =
01101110
Juntando os três bytes numa sequência única, temos 24 bits:
010011010110000101101110
Base64 não olha para grupos de 8 bits (bytes), olha para grupos de 6 bits, porque 2^6 = 64, exatamente o tamanho do alfabeto Base64. Dividindo os mesmos 24 bits em quatro grupos de 6:
| Grupo de 6 bits | Valor decimal | Caractere Base64 |
|---|---|---|
| 010011 | 19 | T |
| 010110 | 22 | W |
| 000101 | 5 | F |
| 101110 | 46 | u |
Lendo os caracteres em ordem: “Man” vira “TWFu”. Não tem mágica nenhuma nisso, é conversão de base: os mesmos 24 bits, só que reagrupados de 8 em 8 para 6 em 6, e cada grupo de 6 bits vira um índice numa tabela de 64 símbolos.
Padding: por que algumas strings Base64 terminam com =
24 bits dividem perfeitamente em quatro grupos de 6. Mas nem toda entrada tem um número de bytes múltiplo de 3, e é aí que entra o caractere =.
| Entrada | Bytes | Saída Base64 | O que acontece |
|---|---|---|---|
| ”M” | 1 byte | TQ== | 1 byte não preenche um grupo de 3, sobram 2 caracteres de dado real e 2 de padding |
| ”Ma” | 2 bytes | TWE= | 2 bytes geram 3 caracteres de dado real e 1 de padding |
| ”Man” | 3 bytes | TWFu | 3 bytes preenchem o grupo inteiro, 4 caracteres, nenhum padding |
O = não carrega informação, ele só avisa ao decodificador “os últimos bits reais acabaram aqui, o resto é preenchimento para fechar o grupo de 4 caracteres”. Por isso é comum ver Base64 terminando em nada, em um = ou em dois ==, dependendo de quantos bytes sobraram no final.
Onde você vê Base64 no dia a dia
Alguns lugares onde Base64 aparece o tempo todo, sem que a maioria perceba:
HTTP Basic Authentication. O cabeçalho Authorization: Basic <base64(usuario:senha)> carrega usuário e senha codificados, não criptografados. "user:pass1234" vira "dXNlcjpwYXNzMTIzNA==". Qualquer um que capture essa requisição decodifica o par em segundos, é por isso que Basic Auth só é aceitável sobre HTTPS.
Payloads JSON ou binários dentro de texto. Um trecho estruturado como {"id":42,"active":true} vira "eyJpZCI6NDIsImFjdGl2ZSI6dHJ1ZX0=", uma string plana que cabe num parâmetro de URL, num campo de formulário ou num JSON aninhado sem quebrar nada.
Data URLs em CSS e HTML. Uma imagem pequena pode ir embutida direto no CSS ou HTML como data:image/png;base64,..., evitando uma requisição HTTP extra ao servidor.
Anexos de e-mail (MIME). O padrão MIME converte anexos binários (PDFs, imagens) em Base64 para trafegar dentro do corpo de mensagens de e-mail, que historicamente só garantem transporte de texto ASCII.
Tokens JWT. Um JWT é composto por três segmentos Base64url separados por ponto: header.payload.signature. O segmento do payload é só Base64 comum (na variante URL-safe), então dá para colar esse pedaço no decodificador abaixo e ler as claims em texto puro. Esta ferramenta não interpreta o JWT inteiro como estrutura, mas decodifica esse segmento normalmente, porque é exatamente o que ele é: Base64.
Vale também ver como texto com acentos e emojis se comporta, porque Base64 trabalha em cima de bytes, não de caracteres visíveis. "Hello, World!" vira "SGVsbG8sIFdvcmxkIQ==". Já "café" vira "Y2Fmw6k=": a palavra tem 4 letras visíveis, mas o é ocupa 2 bytes em UTF-8, então são 5 bytes reais sendo codificados, não 4, o que resulta em 8 caracteres Base64 em vez dos 6 que alguém contando letras esperaria. Um emoji como "🚀" ocupa 4 bytes em UTF-8 e vira "8J+agA==". A regra é sempre a mesma: Base64 conta bytes, nunca caracteres.
Codifique ou decodifique seu próprio texto
Teste o que acabou de ler com qualquer texto seu. Digite abaixo e veja o resultado Base64 aparecer na hora.
E para o caminho inverso, colando uma string Base64 e recuperando o texto original:
Erros comuns e casos especiais
Tratar Base64 como proteção de dados. Vale repetir de forma direta: isso é um anti-padrão de segurança, não um detalhe técnico. Base64 é reversível por qualquer pessoa sem precisar de senha, chave ou ferramenta especial. Se um dado é sensível, ele precisa de criptografia real antes de sair do seu sistema, não de Base64.
Confundir Base64 padrão com Base64URL. O alfabeto padrão usa +, / e =, e esses três caracteres têm significado especial dentro de uma URL (o + pode virar espaço, o / separa caminhos, o = separa chave e valor numa query string). Por isso existe a variante Base64URL, que troca + por - e / por _, e costuma omitir o padding. Se você vir uma string parecida com Base64 numa URL, num nome de arquivo ou num JWT sem nenhum +, / ou = visível, é provavelmente essa variante, não a padrão.
Espaços, quebras de linha ou padding faltando. Decodificadores rigorosos rejeitam a string se ela tiver espaço em branco no meio ou se o número de caracteres de padding estiver errado para o tamanho dos dados. Colar Base64 copiado de um e-mail ou de um PDF, que costuma quebrar linhas a cada 76 caracteres, é uma causa comum desse erro.
Contar caracteres visíveis em vez de bytes. Como mostrado com "café" e "🚀" acima, texto com acentos, ideogramas ou emojis sempre ocupa mais bytes do que caracteres aparentes, e a saída Base64 cresce de acordo com os bytes, não com o que você vê na tela.
Codificar em Base64 uma string que já está em Base64. É um erro fácil de cometer em pipelines automatizados: codificar duas vezes por engano gera uma string válida, mas que ao decodificar uma única vez produz outra string Base64 (ilegível como texto), não o dado original. Se o resultado decodificado ainda parece “estranho” ou cheio de letras e números sem sentido, vale checar se não foi codificado duas vezes.
Perguntas frequentes
Base64 é o mesmo que criptografia? Não. Base64 é uma codificação totalmente reversível, sem chave secreta envolvida. Qualquer pessoa com um decodificador comum recupera o dado original. Criptografia exige uma chave e é, por design, difícil de reverter sem ela.
Por que a saída Base64 é maior que o texto original? Porque cada 3 bytes de entrada se transformam em 4 caracteres de saída, um aumento fixo de cerca de 33%. Isso acontece porque cada caractere Base64 carrega só 6 bits de informação útil, enquanto um byte tem 8, então é preciso mais caracteres para representar a mesma quantidade de dados.
Por que algumas strings Base64 terminam em = ou ==?
Porque o algoritmo trabalha em blocos de 3 bytes de entrada para 4 caracteres de saída, e nem todo texto tem um número de bytes múltiplo de 3. O = completa o último grupo de 4 caracteres quando sobra 1 ou 2 bytes no final, sem carregar dado nenhum, é só um marcador de fim.
Dá para decodificar um JWT inteiro com este decodificador? Dá para decodificar cada segmento do JWT (header e payload) separadamente, já que ambos são apenas Base64url. Cole o segundo segmento (o payload, entre os dois pontos) e você vai ver as claims em JSON puro. Esta ferramenta não interpreta a estrutura completa do token nem verifica a assinatura, ela só reverte a codificação Base64 do trecho que você colar.
É seguro colar dados sensíveis nesses widgets? Sim, tanto a codificação quanto a decodificação acontecem inteiramente no seu navegador, via JavaScript. Nenhum texto digitado é enviado para um servidor.