Todos os artigos
103 artigos · atualizado semanalmente Veja nossas Ferramentas
Todos os artigos
Tutoriais

O que é Base64 e quando essa codificação faz sentido

Entenda o que é Base64, por que não é criptografia e quando essa codificação faz sentido — com os erros mais comuns em produção.

O que é Base64 e quando essa codificação faz sentido
COVER · Tutoriais

Você abriu o JSON de uma API e encontrou um campo com algo como iVBORw0KGgoAAAANSUhEUgAA... que se estende por dezenas de linhas. Ou colou um token e percebeu que ele termina em ==. A primeira reação de muita gente é "isso está criptografado". Não está. É Base64 — uma codificação, não uma cifra. E entender essa diferença é o que separa quem usa Base64 com segurança de quem coloca uma falsa sensação de proteção no sistema.

Base64 resolve um problema bem específico e antigo: como transportar dados binários por canais que só foram feitos para texto. O problema é que ela é usada com frequência onde não deveria, e ignorada onde faria diferença. Este guia mostra o que Base64 realmente é, quando ela faz sentido, e os erros que aparecem em produção quando a expectativa não bate com o que a codificação entrega.

O que é Base64, de verdade

Base64 é um esquema de codificação que representa dados binários usando apenas 64 caracteres ASCII imprimíveis: A-Z, a-z, 0-9, mais + e /. O nome vem daí — base 64 caracteres.

A mecânica é simples. Em vez de trabalhar byte a byte (8 bits), Base64 agrupa os bits de entrada em blocos de 6 bits. Como 2^6 = 64, cada bloco de 6 bits vira exatamente um dos 64 caracteres da tabela. Três bytes de entrada (24 bits) viram quatro caracteres de saída (4 × 6 = 24 bits). É por isso que a saída sempre cresce cerca de 33% em relação à entrada: você gasta 4 caracteres para representar 3 bytes.

Texto:    M        a        n
ASCII:    77       97       110
Binário:  01001101 01100001 01101110
Reagrup:  010011   010110   000101   101110
Decimal:  19       22       5        46
Base64:   T        W        F        u

Quando os bytes de entrada não são múltiplos de 3, sobra espaço. Base64 preenche o resto com o caractere = (padding). Por isso strings Base64 terminam em = ou == com tanta frequência — não é assinatura de criptografia, é só o ajuste de tamanho.

Por que isso existe: o problema do texto-only

Muitos protocolos antigos da internet são "8-bit unsafe": eles podem mexer em bytes que não sejam texto imprimível. O caso clássico é o e-mail. O SMTP foi desenhado para mensagens de texto de 7 bits. Se você tentar enviar um PDF ou uma imagem direto pelo corpo de um e-mail, bytes de controle podem ser reinterpretados, quebrados em linhas ou corrompidos no caminho. Base64 converte o anexo em texto seguro, atravessa o sistema intacto, e é decodificado do outro lado. É exatamente assim que anexos de e-mail funcionam até hoje (via MIME).

O mesmo raciocínio vale para outros lugares onde o dado precisa viver dentro de um formato textual:

  • Data URIs em HTML/CSS — embutir uma imagem pequena direto no markup com data:image/png;base64,..., evitando uma requisição HTTP extra.
  • JSON e APIs REST — JSON não tem tipo binário nativo, então binários (arquivos, hashes, chaves) viajam como strings Base64.
  • JWT — cada parte do token (header, payload, assinatura) é Base64URL, uma variante que troca +/ por -_ para ser segura em URLs.
  • Credenciais HTTP Basicusuario:senha codificado em Base64 no header Authorization.

Repare no último item: HTTP Basic usa Base64, mas isso não protege a senha. Qualquer um decodifica em um segundo. É só empacotamento para caber no header.

O erro número um: confundir codificação com criptografia

Esse é o ponto onde mais sistemas tropeçam. Base64 é totalmente reversível e não usa chave. Não há segredo envolvido. Codificar uma senha, um token ou um documento em Base64 não esconde absolutamente nada de quem tiver acesso à string.

// Isto NÃO protege a senha. Qualquer pessoa reverte.
const fake = btoa("admin:supersecreta123");
atob(fake); // "admin:supersecreta123"

A regra prática: Base64 serve para transporte e representação, não para confidencialidade. Se o objetivo é proteger dados, você precisa de criptografia de verdade (AES, RSA) ou hashing para senhas (bcrypt, Argon2). Base64 pode entrar depois, para empacotar o resultado já cifrado em texto — mas nunca como a camada de proteção em si.

Base64 não é a mesma coisa que UTF-8

Outra confusão comum: tratar Base64 como se fosse um "encoding de texto" no mesmo nível do UTF-8. São coisas diferentes que operam em camadas diferentes. UTF-8 mapeia caracteres para bytes; Base64 mapeia bytes para texto ASCII. Se você tem uma string com acentos ou emoji, primeiro converte para bytes com UTF-8 e só depois aplica Base64 — pular essa etapa é a origem de metade dos bugs de "caractere quebrado". O btoa do navegador, por exemplo, falha com caracteres fora do Latin-1 justamente porque não passa por UTF-8 antes. Se você lida com texto multilíngue, vale entender primeiro a armadilha de encoding do UTF-8, porque ela aparece exatamente no degrau anterior ao Base64.

Quando Base64 faz sentido — e quando não

Base64 vale a pena quando:

  • O canal só aceita texto (e-mail/MIME, alguns campos de JSON, URLs).
  • O dado binário é pequeno (ícones, thumbnails, certificados curtos).
  • Você precisa de uma representação textual estável para logar, copiar ou colar.

Base64 atrapalha quando:

  • O arquivo é grande. O overhead de 33% infla payloads e consome banda; imagens pesadas em Data URI deixam o HTML gigante e não cacheiam separado. Servir o arquivo direto costuma ser melhor.
  • Você espera proteção. Já vimos: não protege nada.
  • O dado já é texto. Codificar um JSON que já é texto em Base64 só desperdiça espaço — a menos que você precise blindar contra um canal que mexe em caracteres especiais.

Para variantes em URL ou nome de arquivo, prefira Base64URL (-_ no lugar de +/), que evita que / vire separador de path e que + vire espaço ao ser decodificado de uma query string. Quando precisar inspecionar ou gerar uma string rapidamente, a ferramenta de codificar e decodificar Base64 faz os dois sentidos direto no navegador, sem enviar nada para um servidor.

Perguntas frequentes

Qual a diferença entre Base64 e criptografia?

Base64 é codificação reversível e sem chave: serve para representar bytes como texto, e qualquer um pode reverter. Criptografia usa uma chave secreta para tornar o dado ilegível sem ela. Base64 não esconde informação; criptografia esconde. Misturar os dois conceitos é o erro de segurança mais comum com Base64.

Por que strings Base64 terminam em "=" ou "=="?

O = é padding. Base64 processa a entrada em blocos de 3 bytes que viram 4 caracteres. Quando o total de bytes não é múltiplo de 3, sobra um pedaço, e o = completa o último grupo de 4 caracteres. Um = indica que faltava 1 byte no último bloco; ==, que faltavam 2. Não tem relação com criptografia.

Base64 deixa o dado maior ou menor?

Maior. A saída fica cerca de 33% maior que a entrada original, porque cada 3 bytes viram 4 caracteres. Por isso Base64 é ruim para arquivos grandes — você paga overhead de tamanho em troca da compatibilidade com canais de texto.

Posso usar Base64 para armazenar imagens no banco de dados?

Pode, mas raramente compensa. A imagem fica 33% maior, índices e backups incham, e você perde cache de arquivo. Para a maioria dos casos é melhor guardar o arquivo em storage (S3, disco, CDN) e salvar só o caminho no banco. Base64 inline só ganha em ícones minúsculos dentro de HTML/CSS.

O que levar deste guia

Base64 é um tradutor entre o mundo binário e o mundo do texto — nada mais, nada menos. Ele faz sentido quando o canal só fala texto e o dado é pequeno: e-mail, Data URIs, campos binários em JSON, partes de um JWT. Ele atrapalha quando o arquivo é grande (33% de overhead) ou quando alguém espera que ele proteja algo. A frase para guardar: Base64 muda a forma do dado, nunca o segredo dele. Decidir com base nisso elimina de uma vez os dois erros que mais aparecem em produção — o payload inchado e a falsa sensação de segurança.

RD
Autor
Rafael Duarte
Desenvolvedor backend com passagem por fintech e SaaS B2B — trabalhou em times que escalaram APIs de zero a milhões de requisições. Carrega cicatrizes de produção suficientes para ter opiniões fortes sobre ferramentas, padrões e decisões de arquitetura. Não é acadêmico: leu a RFC do UUID quando precisou escolher entre v4 e v7 para uma tabela de alta escrita.
Ver perfil