O que é Base64?
Base64 é um esquema de codificação que representa dados binários como uma sequência de caracteres ASCII imprimíveis. Ele pega qualquer sequência de bytes — seja uma imagem, um PDF ou dados binários brutos — e os codifica em uma string composta apenas por 64 caracteres seguros: A–Z, a–z, 0–9, + e / (com = para preenchimento).
O nome "Base64" vem do fato de que a codificação usa um sistema numérico de base 64.
Os 64 caracteres
| Grupo | Caracteres |
|---|---|
| Maiúsculas | A–Z (26) |
| Minúsculas | a–z (26) |
| Dígitos | 0–9 (10) |
| Símbolos | +, / (2) |
| Preenchimento | = |
Existem também variantes seguras para URL que substituem + por - e / por _, evitando conflitos com caracteres especiais de URL.
Como funciona a codificação Base64
Base64 funciona convertendo cada 3 bytes de dados binários em 4 caracteres Base64.
- Pegar 3 bytes (24 bits) da entrada
- Dividir em quatro grupos de 6 bits
- Mapear cada valor de 6 bits para um caractere do alfabeto Base64
Exemplo: Codificação da string "Man"
| Caractere | M | a | n |
|---|---|---|---|
| ASCII | 77 | 97 | 110 |
| Binário | 01001101 | 01100001 | 01101110 |
Combinado: 010011010110000101101110
Dividido em grupos de 6 bits: 010011 | 010110 | 000101 | 101110
Mapeado: T | W | F | u → "TWFu"
Se a entrada não for um múltiplo de 3 bytes, o preenchimento com caracteres = é usado para completar o último grupo.
Sobrecarga de tamanho
A codificação Base64 aumenta o tamanho dos dados em aproximadamente 33% (cada 3 bytes se tornam 4 caracteres). Considere isso ao decidir usar Base64 para dados grandes.
Breve histórico
Base64 foi desenvolvido no contexto do MIME (Extensões de Correio da Internet para Múltiplos Fins), padronizado em 1992 pelo RFC 1341. Os sistemas de e-mail foram originalmente projetados para transmitir apenas texto ASCII de 7 bits, mas anexos como imagens e documentos são dados binários. Base64 resolveu isso codificando dados binários como texto simples que podia transitar com segurança pela infraestrutura de e-mail.
O nome e o conceito apareceram ainda mais cedo no uuencode do Unix (um esquema diferente, mas relacionado), mas o Base64 do MIME tornou-se o padrão duradouro.
Casos de uso comuns
1. Incorporar imagens em HTML/CSS
Em vez de referenciar um arquivo de imagem externo, você pode incorporar uma imagem diretamente usando uma URI de dados codificada em Base64:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
Quando usar: Ícones pequenos ou imagens que economizam requisições HTTP no caminho crítico de renderização.
Quando evitar: Imagens grandes — a sobrecarga de 33% mais a impossibilidade de armazenar a imagem em cache separadamente superam os benefícios.
2. Autenticação HTTP Básica
A autenticação HTTP Basic envia credenciais como uma string codificada em Base64 no cabeçalho Authorization:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Isso é username:password codificado em Base64. Importante: Isso NÃO é criptografia — é trivialmente decodificável. Sempre use HTTPS com autenticação básica.
3. JWT (JSON Web Tokens)
Os tokens JWT são compostos por três seções codificadas em Base64URL separadas por pontos: cabeçalho, payload e assinatura. O cabeçalho e o payload são legíveis (não criptografados) — o Base64 aqui é puramente para codificação de transporte.
4. Anexos de e-mail (MIME)
Como caso de uso original do Base64: clientes de e-mail codificam anexos binários (imagens, PDFs, etc.) em Base64 para transmiti-los com segurança pela infraestrutura de e-mail.
5. Armazenar dados binários em JSON ou XML
Como JSON e XML suportam apenas texto, dados binários (como chaves de criptografia ou imagens pequenas) frequentemente são codificados em Base64 antes da inclusão.
6. URLs de dados em CSS
Imagens de fundo podem ser incorporadas diretamente no CSS:
background-image: url('data:image/svg+xml;base64,PHN2ZyB4...');
Variantes do Base64
| Variante | Caracteres | Caso de uso |
|---|---|---|
| Base64 padrão | A–Z a–z 0–9 + / | Propósito geral |
| Base64 seguro para URL | A–Z a–z 0–9 - _ | URLs, nomes de arquivo, JWTs |
| Base64 sem preenchimento | Omite = | Algumas APIs preferem isso |
| MIME Base64 | Padrão + quebras de linha a cada 76 chars |
Considerações de segurança
Base64 NÃO é criptografia
Este é o ponto mais crítico: Base64 é uma codificação, não criptografia. Qualquer pessoa que tenha a string Base64 pode decodificá-la instantaneamente — nenhuma chave é necessária. Nunca use Base64 para "ocultar" informações sensíveis.
echo "dXNlcm5hbWU6cGFzc3dvcmQ=" | base64 --decode
# Saída: username:password
Não codifique senhas em Base64
Armazenar senhas como Base64 oferece segurança zero. Use algoritmos de hash de senha adequados como bcrypt, Argon2 ou scrypt.
Riscos de XSS com URIs de dados
Embora as URIs de dados Base64 em si sejam seguras, JavaScript malicioso pode ser codificado e executado via URIs data:text/html;base64,... em alguns contextos do navegador. A maioria dos navegadores modernos restringe isso para navegação de links e fontes de iframe, mas sempre sanitize URIs de dados fornecidas pelo usuário.
Base64 em linguagens de programação
JavaScript
// Codificar
const encoded = btoa("Hello, World!"); // "SGVsbG8sIFdvcmxkIQ=="
// Decodificar
const decoded = atob("SGVsbG8sIFdvcmxkIQ=="); // "Hello, World!"
Nota: btoa/atob só funcionam com strings Latin-1 em navegadores. Para Unicode:
// Codificação segura para Unicode
const encoded = btoa(unescape(encodeURIComponent("こんにちは")));
Ou use Buffer no Node.js:
Buffer.from("Hello").toString("base64");
Buffer.from("SGVsbG8=", "base64").toString("utf8");
Python
import base64
# Codificar
encoded = base64.b64encode(b"Hello, World!").decode("utf-8")
# "SGVsbG8sIFdvcmxkIQ=="
# Decodificar
decoded = base64.b64decode("SGVsbG8sIFdvcmxkIQ==").decode("utf-8")
# "Hello, World!"
# Variante segura para URL
url_safe = base64.urlsafe_b64encode(b"Hello+World/")
Considerações de desempenho
- Codificação/decodificação é rápida: Para a maioria dos casos de uso, a sobrecarga do Base64 é insignificante.
- Sobrecarga de tamanho: ~33% maior que o binário. Evite para arquivos grandes (MB+) transmitidos com frequência.
- Pressão no cache da CPU: Codificar grandes arquivos binários na memória pode pressionar o cache da CPU.
Para grandes transferências binárias, prefira protocolos binários (HTTP/2 com enquadramento binário, frames binários de WebSocket, gRPC com protobuf) em vez de Base64.
Resumo
Base64 é uma dessas tecnologias fundamentais que sustentam grande parte da web moderna sem que a maioria dos desenvolvedores pense sobre isso. Ele resolve bem um problema específico: codificar com segurança dados binários como texto imprimível para transmissão em sistemas baseados em texto.
Use Base64 quando: Você precisar incorporar dados binários em contextos de texto (HTML, JSON, e-mail, cabeçalhos).
Não use Base64 quando: Você quiser criptografar ou proteger dados — Base64 é completamente reversível sem qualquer chave.