Um texto como T2xhLCBtdW5kbyE= parece embaralhado, e é
fácil concluir que está protegido. Não está: é só Ola, mundo!
escrito em Base64, e qualquer pessoa o lê em segundos. Confundir
codificação, hash e criptografia é uma das origens mais comuns de falhas
de segurança em sistemas reais. Este guia separa os três conceitos e
mostra como o Base64 funciona por dentro.
Três coisas que parecem iguais e não são
- Codificação (encoding): converte dados de uma representação para outra para que possam ser transportados ou exibidos. Não usa segredo e é reversível por qualquer um. Exemplos: Base64, URL encoding, entidades HTML.
- Hash: gera um resumo de tamanho fixo que identifica o conteúdo. É de mão única: não existe "desfazer". Serve para integridade e verificação, não para esconder dados. Veja MD5, SHA-1 e SHA-256: qual usar e para quê.
- Criptografia: embaralha os dados de modo que só quem tem a chave consegue reverter. É a única das três que protege a confidencialidade. Exemplo: AES.
Regra prática: se você consegue desfazer a transformação sem conhecer nenhum segredo, isso não é proteção.
Como o Base64 funciona
Computadores lidam com bytes (8 bits), mas vários canais de texto, como
e-mail, JSON e URLs, não aceitam bytes arbitrários. O Base64 resolve
isso usando um alfabeto de 64 caracteres seguros: as letras maiúsculas
A-Z, as minúsculas a-z, os dígitos
0-9, e os símbolos + e /.
O processo é este:
- Agrupe os bytes de três em três (24 bits).
- Divida esses 24 bits em quatro blocos de 6 bits.
- Cada bloco de 6 bits (valor de 0 a 63) vira um caractere do alfabeto.
- Se sobrarem bytes no final (um ou dois), completa-se com o caractere
=.
Exemplos clássicos:
"Man" → TWFu (3 bytes → 4 caracteres, sem preenchimento)
"Ma" → TWE= (2 bytes → 3 caracteres + 1 "=")
"M" → TQ== (1 byte → 2 caracteres + 2 "=")
Como cada 3 bytes viram 4 caracteres, o Base64 aumenta o tamanho em cerca de um terço (4/3). É o preço de poder transportar qualquer dado em texto puro.
Acentos e UTF-8
O Base64 opera sobre bytes, não sobre letras. Portanto, o texto precisa
ser convertido para bytes antes, normalmente em UTF-8. A palavra
ação tem 6 bytes em UTF-8 (cada letra acentuada ocupa dois)
e vira YcOnw6Nv. Um erro frequente em JavaScript é passar
texto com acentos direto à função btoa(): ela só aceita
caracteres de um byte e lança uma exceção com outros. A solução é
codificar o texto em UTF-8 antes. Você pode testar isso no
codificador de Base64.
Base64URL: a variante para URLs e tokens
Os símbolos + e / têm significado especial em
URLs. A variante Base64URL troca-os por - e _ e
costuma dispensar o preenchimento com =. É essa variante que
aparece nos tokens JWT, explicados em
JWT: como funciona e por que decodificar não é validar.
Para outros caracteres especiais em endereços, veja também o
URL encode/decode.
Onde o Base64 é útil
- Anexos de e-mail (MIME), que historicamente só aceitavam texto.
- Imagens embutidas diretamente em HTML ou CSS por meio de data URIs.
- Transportar dados binários dentro de JSON ou XML.
- Partes de tokens e cabeçalhos HTTP.
Onde ele é mal usado
O cabeçalho HTTP Authorization: Basic, por exemplo, envia
usuario:senha em Base64. Isso não é proteção: quem intercepta
a requisição decodifica na hora. A segurança nesse caso vem de trafegar
tudo por HTTPS, e não do Base64. O mesmo vale para "esconder" chaves de
API ou senhas em arquivos de configuração codificados: quem abrir o
arquivo lê o conteúdo.
Se o objetivo é realmente proteger um texto, é preciso criptografia com uma chave secreta bem guardada, como a que o site oferece na ferramenta de criptografia AES, e mesmo assim o resultado costuma ser convertido para Base64 só para poder ser copiado e transportado. Ou seja, os dois conceitos trabalham juntos: a criptografia protege, o Base64 apenas transporta.