Resumo
Base64 é uma forma de escrever qualquer sequência de bytes usando 64 caracteres seguros (A–Z, a–z, 0–9, +, /). Ele existe para que dados binários, como uma imagem, um PDF ou uma chave, possam passar por sistemas que só lidam com texto: corpo de e-mail, strings JSON, URLs, atributos HTML. É codificação, não criptografia: não há chave, e decodificar é uma única chamada de função disponível em qualquer linguagem e no console de desenvolvedor de qualquer navegador. Uma senha guardada “em Base64” está guardada em texto puro, só que com etapas a mais.
Por que ele existe
O e-mail foi projetado nos anos 1970 para ASCII de 7 bits. Quando os anexos chegaram (MIME, 1992), os bytes de um JPEG, que usam todos os 256 valores, inclusive alguns que para um servidor de e-mail significam “fim de linha” ou “fim da mensagem”, precisavam ser disfarçados de texto inofensivo. O Base64 foi a resposta: pegar três bytes (24 bits), dividi-los em quatro grupos de 6 bits e associar cada grupo a um de 64 caracteres. Cada 3 bytes viram 4 caracteres, e daí vem o famoso acréscimo de 33%: um anexo de 3 MB vira um e-mail de 4 MB, e é por isso que um limite de “25 MB” comporta um arquivo de 18 MB.
O mesmo truque aparece sempre que o texto é o único canal disponível: embutir uma imagem pequena direto numa página web (data:image/png;base64,…), colocar um token binário num cabeçalho HTTP (Authorization: Basic …), transportar certificados e chaves em arquivos PEM e enfiar um array de bytes num campo JSON.
As variantes que pegam as pessoas
- Padrão ou seguro para URL. O Base64 padrão usa
+e/, e os dois têm significado numa URL. O alfabeto seguro para URL (RFC 4648 §5) troca esses caracteres por-e_. Um token gerado com um alfabeto e decodificado com o outro falha nesses dois caracteres. Os JWTs usam a forma segura para URL. - Preenchimento. O tamanho da saída é sempre múltiplo de quatro, completado com
=. Alguns geradores removem o preenchimento (os JWTs de novo); alguns decodificadores exigem que ele esteja lá. Se a decodificação falhar numa string que parece válida, acrescente=até o tamanho ser divisível por quatro. - Quebra de linha. O MIME quebra a cada 76 caracteres; o PEM, a cada 64. Os decodificadores em geral ignoram espaços em branco, mas nem todos.
- A codificação de texto por baixo. O Base64 codifica bytes. Para passar uma string para Base64, primeiro você a transforma em bytes, e a escolha entre UTF-8, UTF-16 ou Latin-1 muda o resultado. O bug clássico do JavaScript,
btoa("é")lançando erro, é exatamente isso:btoasó aceita Latin-1. Converta para bytes UTF-8 antes.
A ferramenta Base64 lida com os dois alfabetos, com preenchimento, quebra de linha e UTF-8, e decodifica para texto ou para um arquivo baixável, de modo que uma URL data: ou um anexo de e-mail pode voltar a ser o original no próprio navegador.
Codificar, gerar hash, criptografar
Essas três palavras são usadas como sinônimos em textos informais e significam coisas completamente diferentes.
| Reversível? | Precisa de chave? | Finalidade | |
|---|---|---|---|
| Codificação (Base64, hex, codificação de URL) | Sim, por qualquer um | Não | Fazer os dados caberem num canal |
| Hash (SHA-256, MD5) | Não | Não | Gerar uma impressão digital dos dados; verificar que não foram alterados |
| Criptografia (AES, RSA) | Sim, com a chave | Sim | Manter os dados em segredo para quem não tem a chave |
O hash de um arquivo permite verificar se um download corresponde ao que o autor publicou. O Gerador de Hash calcula MD5, SHA-1 e SHA-256/384/512 no navegador e compara com um checksum colado. Ele não esconde nada: o arquivo continua sendo o arquivo. A criptografia é a única das três que oferece sigilo, e ela só é tão forte quanto a chave, que é onde entra uma senha realmente aleatória.
Se você estava prestes a passar um segredo para Base64
Não faça isso. Em particular:
- Arquivos de configuração com senhas em Base64 (um padrão comum em aplicações Java e .NET mais antigas) são senhas em texto puro para qualquer pessoa que abra o arquivo.
- Chaves de API “ofuscadas” no JavaScript do front-end aparecem na aba de rede, em Base64 ou não.
- A autenticação Basic sobre HTTP simples envia o usuário e a senha codificados em Base64, ou seja, às claras. Ela só é aceitável dentro de HTTPS, onde o transporte faz a criptografia.
Se os dados precisam ser armazenados ou enviados e continuar em segredo, criptografe-os com uma cifra de verdade (AES-256-GCM pela biblioteca criptográfica da plataforma) e depois, se tiverem de passar por um canal de texto, aplique Base64 ao texto cifrado. Codificar depois de criptografar não tem problema. O erro é codificar no lugar de criptografar.