Lição 6

Erros comuns em Base64

Alfabeto errado, quebras de linha e decode incorreto de texto UTF-8.

Armadilhas de Base64 se agrupam em quatro temas: mistura de alfabeto, surpresas de espaço em branco, double encoding e tratar mal texto UTF-8 vs bytes brutos.

Sopa de alfabeto

Sintomas:

  • falhas intermitentes de decode quando -/_ (URL-safe) e +// (padrão) se misturam
  • fragmentos com cara de JWT que ainda têm + ou / onde a spec esperava Base64URL

Remediação: centralize conversões; escreva testes unitários com round-trip fiel para amostras canônicas (MIME com padding, vetores URL-safe sem padding).

Evite “consertos” regex espalhados em serviços — eventualmente um caminho esquece trim ou normaliza errado.

Peculiaridades de case

Case importa para índices de segmento A–Z vs a–z; .toLowerCase() no payload inteiro destrói informação.

Espaço em branco e newlines persistentes

Cópia de PDF/e-mail costuma injetar espaços e quebras suaves.

Estratégias:

  • decode com flag ignoreWhitespace da biblioteca só quando a spec permitir
  • parsing PEM remove linhas de header/footer — não espaços interiores arbitrários de forma confiável
  • pipeline de log pode partir registros — rejeite fragmentos suspeitamente curtos

Trate espaços Unicode invisíveis (espaço fino sem quebra, BOM) como bugs: normalize entrada cedo com lista explícita do que é permitido.

Bugs de ordem com decode de URL

Aplicar percent-decode duas vezes ou trocar ordem com normalização Base64 gera bytes lixo — especialmente %2B, %2F, %3D (equivalentes de +, /, =).

Exercite o caminho: tokens enviados pelo usuário passando por vários proxies — capture a query bruta antes de frameworks reescreverem espaços.

Escada acidental de double encoding

Alguém Base64 codifica JSON de credenciais, recebe string, Base64 de novo por engano, grava no banco — o artefato armazenado não bate com suposição de nenhuma parte.

Estabeleça nomes no código (encodeOnce, responsabilidades por camada) e logs de asserção com comprimento + primeiros caracteres do alfabeto hasheados para diff forense sem vazar segredos.

Confusão com texto UTF-8

“Você codificou meu texto em chinês errado.” Frequentemente é mix-up de camada: alguém codificou bytes UTF-8 da string mas decodificou com charset errado, ou comparou com normalização diferente do mesmo texto lógico.

Use helpers da linguagem que deixem o pipeline explícito: string Unicode → bytes UTF-8 → texto Base64, e o inverso ao decodificar.

Nunca assuma code page legada de byte único — páginas de código historicamente geraram mojibake após decode.

Payloads JSON

JSON exige UTF-8 (ou alternativas documentadas com escapes pesados). Codifique bytes do JSON serializado, não divergência de pretty-print com BOM versus normalização do servidor.

Colunas TEXT vs BINARY no banco

Salvar protobuf decodificado de Base64 em coluna TEXT com transformações de collation pode corromper sutilmente — inadequado, mas observado quando ORM rotula tipos errado.

Notas de segurança

Blobs Base64 são opacos para olhos casuais, não confidenciais. Enviar segredos só em Base64 equivale a texto claro em transportes não confiáveis.

Assinaturas e MACs operam em layouts de bytes canônicos — mudar forma de padding ou case invalida verificação em silêncio.

Armadilhas de tempo constante

Raro mas real: comparação ingênua de strings em segredos derivados de Base64 vs timing attacks — prefira crypto.timingSafeEqual ou equivalente ao comparar tokens brutos — problema adjacente, não do Base64 em si.

Resumo

Interop ganha quando o time concorda em:

  1. Regras de alfabeto e padding
  2. Normalização pré-decode (newline / passos de URL)
  3. Se o conteúdo é textual (UTF-8) ou bytes opacos
  4. Sem encoding recursivo sem camadas de protocolo documentadas

Estabeleça vetores dourados em CI para pegar regressões cedo.

Cole amostras problemáticas no Codificador / Decodificador Base64 — alterne alfabeto padrão e URL-safe e observe se o round-trip falha antes de culpar a API.

Voltar à visão geral do curso