O que é Base64 e quando se usa

Base64 é um jeito de escrever bytes quaisquer usando apenas 64 caracteres seguros: letras maiúsculas e minúsculas, dígitos, o mais e a barra. É necessário quando dados binários precisam passar por um canal feito para texto: anexos de e-mail, imagens embutidas em uma página como data URI, chaves e certificados em arquivos PEM, tokens JWT.

O mecanismo é simples: pegam-se três bytes, ou seja, 24 bits, e divide-se em quatro grupos de seis. Seis bits vão de 0 a 63, e cada valor corresponde a um caractere. Quando sobram um ou dois bytes no final, eles são completados com zeros e o sinal = indica quantos caracteres não levam dados. Por isso uma string Base64 é sempre cerca de um terço mais longa que os dados originais.

Base64 não é criptografia: qualquer pessoa pode decodificá-lo sem chave. Ele converte, não protege. A variante URL-safe troca + e / por - e _, porque os dois primeiros têm significado em endereços web, e muitas vezes omite o padding.

Erros comuns

  • Achar que Base64 serve para esconder uma senha: é uma codificação que qualquer um pode reverter e não oferece segurança nenhuma.
  • Decodificar como texto dados que não são texto: uma imagem ou uma chave em Base64 geram bytes que não formam UTF-8 válido, e isso é normal.
  • Misturar os dois alfabetos: uma string URL-safe com - e _ passada a um decodificador padrão é rejeitada, ou lida errado se ele ignorar caracteres desconhecidos.

Perguntas frequentes

Por que a string Base64 termina com um ou dois sinais =?

Porque os dados não eram múltiplo de três bytes. Com um byte sobrando saem dois caracteres e dois =, com dois bytes três caracteres e um =. O padding diz ao decodificador quantos bytes reconstruir; muitos decodificadores, inclusive este, aceitam mesmo sem ele.

Quanto um arquivo fica maior em Base64?

Cada três bytes viram quatro caracteres, ou seja, cerca de 33% a mais, arredondado para múltiplo de quatro. Uma imagem de 30 kB vira uma string de uns 40 kB.

O que significa o inteiro big-endian?

Os bytes são lidos como um único número, com o primeiro byte como dígito mais significativo na base 256. Os bytes 01 00 valem 256. É a mesma ordem usada nos protocolos de rede e nos números grandes da criptografia.

Por que o texto decodificado mostra caracteres estranhos ou não aparece?

Porque os bytes não são texto UTF-8: podem ser uma imagem, um arquivo compactado ou um texto em outra codificação, como Latin-1. Nesse caso o que vale é o hexadecimal, que mostra os bytes como eles são.

Como funciona este cálculo

Cada grupo de três bytes b₁ b₂ b₃ forma o número N = b₁·65536 + b₂·256 + b₃. Os quatro caracteres são as posições ⌊N / 262144⌋, ⌊N / 4096⌋ mod 64, ⌊N / 64⌋ mod 64 e N mod 64 no alfabeto ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/. A decodificação faz o caminho inverso. O inteiro é a soma dos bytes ponderados por 256 elevado à sua posição contada a partir da direita.