Base64 vs Hex: quando cada codificação faz sentido
Mesmos bytes, dois encodings. Comparativo de tamanho, legibilidade e onde cada um brilha — com exemplos reais.
Num projeto de geração de tokens, tive que decidir entre Base64 e Hex para armazenar 32 bytes aleatórios. Parece trivial até você lembrar que essa decisão afeta tamanho de coluna, comparações em banco, e como o dado aparece em logs. Este post é o que eu precisava antes de tomar essa decisão.
Os dois encodings representam os mesmos bytes — a diferença é o alfabeto usado e o espaço que ocupam.
O que cada um faz
Hex usa 16 caracteres (0-9, a-f). Cada byte vira dois chars. 32 bytes → 64 chars.
Base64 usa 64 caracteres (letras, números, +, /). Cada 3 bytes viram 4 chars, com padding = quando necessário. 32 bytes → 44 chars (incluindo até 2 chars de padding).
32 bytes aleatórios:
Hex: a3f2bc... (64 chars)
Base64: o/K8... (44 chars, ~33% menor)
Quando usar cada um
Use Hex quando:
- O valor vai aparecer em logs ou URLs diretamente (mais legível)
- Você precisa comparar prefixos (tokens de sessão que começam com determinado padrão)
- A linguagem/banco que você usa manipula hex nativamente (
decode('...', 'hex')no PostgreSQL, por exemplo) - Você está debugando e quer conseguir ler o valor sem tool adicional
Use Base64 quando:
- Tamanho importa (APIs, cookies, headers HTTP têm limites)
- Você está encodando dados binários arbitrários (imagens, arquivos) em JSON ou HTML
- O sistema receptor já espera Base64 (JWTs, por exemplo, usam Base64URL)
Base64URL: a variante que você vai encontrar em JWT
Base64 padrão usa + e /, que têm significado especial em URLs. Base64URL substitui + por - e / por _, e remove o padding =. Isso torna o valor seguro para URLs e headers HTTP sem encoding adicional.
// Base64 padrão
btoa(String.fromCharCode(...bytes)) // pode conter +, /, =
// Base64URL (o que JWT usa)
btoa(String.fromCharCode(...bytes))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '')
O Encoder Base64 do Quick Tools suporta ambas as variantes.
Na prática: tokens de sessão
Para tokens de sessão de 32 bytes:
| Formato | Tamanho | Caracteres seguros pra URL | Legível em log |
|---|---|---|---|
| Hex | 64 chars | Sim | Sim |
| Base64 | 44 chars | Não (tem +, /, =) |
Razoável |
| Base64URL | 43 chars | Sim | Razoável |
Para armazenar em cookie ou header de autorização: Base64URL. Para logar em texto plano e debugar: Hex. Para guardar em banco de dados como texto: os dois funcionam, mas Hex é mais fácil de filtrar e indexar em SQL.
A decisão não é irreversível, mas é chata de mudar
Uma vez que você escolhe um encoding para um token em produção, mudar significa migrar todos os tokens existentes. Valide a escolha com base em onde o valor vai ser usado mais frequentemente, não apenas onde ele é gerado.
Checklist prático para escolher Base64 ou hexadecimal
Use hexadecimal quando o valor precisa ser inspecionado por humanos, comparado em logs ou copiado entre sistemas de desenvolvimento. Hashes SHA, checksums, IDs binários curtos e dumps de bytes ficam mais previsíveis em hex porque cada byte vira exatamente dois caracteres. Isso facilita revisar diferenças, contar tamanho e encontrar prefixos.
Use Base64 quando o objetivo é transportar bytes com menos overhead. Imagens pequenas embutidas em JSON, payloads de API, anexos e tokens geralmente ficam mais compactos em Base64 do que em hexadecimal. O trade-off é legibilidade: Base64 é melhor para máquinas, hex é melhor para humanos.
Uma regra simples: se alguém vai debugar olhando para a string, prefira hex. Se a string só precisa atravessar um canal textual com menor tamanho, prefira Base64. Antes de padronizar, teste ida e volta com dados reais no Base64 Encoder e valide também o decode para evitar problemas com charset, padding ou quebras de linha.
Perguntas frequentes
Base64 é criptografia?
Não. Base64 é apenas codificação. Qualquer pessoa pode decodificar o conteúdo sem chave. Não use Base64 para esconder segredos, senhas ou tokens sensíveis.
Hexadecimal aumenta mais o tamanho?
Sim. Hexadecimal dobra o tamanho dos bytes originais. Base64 costuma adicionar cerca de 33%, por isso é mais comum para transporte de arquivos e payloads maiores.
Armadilha comum
O erro mais comum é escolher o formato pela aparência, não pelo uso. Base64 parece mais compacto, mas é ruim para inspeção manual. Hex parece maior, mas é excelente para comparar bytes e hashes. Em documentação técnica, mostre sempre um exemplo de entrada e saída para que outras pessoas saibam exatamente qual codificação esperar.
- 01 diff antes de abrir PR: o hábito que reduz comentários de revisão Ler o próprio diff antes de abrir um PR muda o que você vê no código. Como e por que esse hábito reduz ciclos de revisão e melhora a qualidade dos PRs.
- 02 `P@ssw0rd1` passa na sua validação. Esse é o problema. O que o NIST mudou em 2024 sobre senhas: comprimento bate complexidade, leet speak está no rockyou.txt e rotação obrigatória enfraquece senhas.