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
ignoreWhitespaceda 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:
- Regras de alfabeto e padding
- Normalização pré-decode (newline / passos de URL)
- Se o conteúdo é textual (UTF-8) ou bytes opacos
- 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.