Codificação e segurança

Base64 não é criptografia: para que serve e o que usar quando você realmente precisa de sigilo

O Base64 transforma bytes em texto para que eles sobrevivam a sistemas feitos para texto. Qualquer um desfaz isso com uma chamada. Onde ele cabe (e-mail, JSON, data URLs), os 33% que custa e a diferença entre codificar, gerar hash e criptografar.

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: btoa só 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.

Texto para falaTextToSpeech.tools Comprimir vídeoFreeCompress.video Dicionário chinês-inglêsChineseDict.com