Como decodificar Base32
- Cole a string em Entrada · Base32 (RFC 4648). Maiúsculas ou minúsculas, espaços entre grupos e quebras de linha são aceitos, e o preenchimento
=é opcional. - Leia o texto decodificado em Saída · Texto. O charset padrão é UTF-8; mude o Charset abaixo da saída se o texto veio de outro sistema.
- Se a saída for um amontoado de símbolos, os dados são binários. Ajuste Para em Hex ou Base64 para ver os bytes, ou clique em Salvar bytes para baixá-los como arquivo.
- Se a entrada usa outro alfabeto, mude De para Base32hex, Crockford Base32 ou z-base-32.
- Para codificar, clique em Texto → Base32 (RFC 4648) no seletor de direção, ou use o codificador Base32.
O que o decodificador aceita e rejeita
O decodificador é tolerante com a formatação e rígido com o conteúdo:
| Entrada | Resultado |
|---|---|
JBSWY3DP | Hello |
jbswy3dp | Hello; a caixa não importa |
JBSW Y3DP EHPK 3PXP | 10 bytes, 48656c6c6f21deadbeef em hex |
MZXW6YQ | foob; preenchimento ausente não é problema |
JBSWY3D0 | Erro: caractere inesperado "0" na posição 8 |
O erro aponta o primeiro caractere que não pertence ao alfabeto. Um 0, 1, 8 ou 9 quase sempre significa que a string usa outro alfabeto Base32, e um + ou / significa que ela é, na verdade, Base64; experimente o decodificador Base64.
Decodificando um segredo de 2FA ou TOTP
A chave que um app autenticador mostra durante a configuração, muitas vezes agrupada como jbsw y3dp ehpk 3pxp, é Base32 da RFC 4648. Decodificá-la dá a chave HMAC bruta, que são bytes aleatórios, então veja-a como Hex em vez de Texto. O comprimento indica o tamanho da chave: 16 caracteres são 10 bytes, 32 caracteres são 20 bytes (160 bits, o tamanho que a RFC 4226 recomenda), 52 caracteres são 32 bytes.
Para conferir se você tem o segredo certo, gere um código com ele. Esta função Python decodifica o segredo do mesmo jeito tolerante e depois segue a RFC 6238:
import base64, hashlib, hmac, struct
def totp(secret, t, digits=6, step=30):
s = secret.replace(" ", "").upper()
key = base64.b32decode(s + "=" * (-len(s) % 8))
mac = hmac.new(key, struct.pack(">Q", t // step), hashlib.sha1).digest()
off = mac[-1] & 0x0F
code = struct.unpack(">I", mac[off:off + 4])[0] & 0x7FFFFFFF
return str(code % 10**digits).zfill(digits)
totp("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", 59, 8) # '94287082'
O segredo e o 94287082 esperado são o vetor de teste SHA-1 da RFC 6238. Para o código atual, passe int(time.time()) como t. Mais padrões de decodificação estão na página de Python.
IPFS CIDv1 e outros Base32 com prefixo
Alguns formatos colocam um marcador na frente do Base32. As strings IPFS CIDv1 começam com b, o código multibase para Base32 da RFC 4648 em minúsculas e sem preenchimento: em bafybei… o b é o prefixo e afybei… são os dados. Remova o b, decodifique e ajuste Para em Hex. Os primeiros bytes são a versão do CID (01), o tipo de conteúdo (70 para dag-pb) e o cabeçalho do multihash (1220 para um SHA-256 de 32 bytes).
Os endereços onion v3 do Tor funcionam do mesmo jeito, sem prefixo: os 56 caracteres antes de .onion são Base32 de 35 bytes, uma chave pública de 32 bytes, um checksum de 2 bytes e um byte de versão (03).
Problemas comuns
- O Python lança
binascii.Error: Non-base32 digit found. A entrada está em minúsculas. Passecasefold=Truepara ob32decode, ou chame.upper()antes. - O Python lança
binascii.Error: Incorrect padding. Os sinais=foram removidos. Complete o comprimento até um múltiplo de 8, como na função acima. - O
base32 -ddizinvalid input. O GNU coreutils não aceita minúsculas nem espaços. Limpe a string antes ou decodifique aqui. - O texto decodifica, mas para a coisa errada. Strings base32hex e Crockford decodificam sem erro com o alfabeto errado. Se a fonte diz “Base32” mas a string não tem
0,1,8nem9, a RFC 4648 continua sendo a melhor aposta; caso contrário, experimente as outras duas.
Perguntas frequentes
Como decodificar um segredo TOTP?
Cole o segredo (o valor secret= de um link otpauth://, ou a chave em texto que o app mostra no lugar do QR code) e ajuste Para em Hex. O resultado é a chave HMAC bruta. São bytes aleatórios, então a saída Texto vai parecer lixo, e isso é esperado.
Por que o Python diz Incorrect padding ao decodificar Base32?
O base64.b32decode quer que o comprimento seja múltiplo de 8. Acrescente antes os = que faltam: s + "=" * (-len(s) % 8). Este decodificador não precisa de preenchimento.
Dá para decodificar um ULID aqui?
Não diretamente. Um ULID usa o alfabeto Crockford, mas codifica um único número de 128 bits em 26 caracteres, começando com 2 bits sobrando. A opção Crockford daqui empacota bytes a partir do primeiro caractere, então devolve bytes deslocados para um ULID.
Quais caracteres são inválidos em Base32?
No Base32 da RFC 4648, qualquer coisa além de A–Z, 2–7 e = no final. Os dígitos 0, 1, 8 e 9 são o sinal habitual de que a string é base32hex ou Crockford; mude De para testá-los.