Como converter Base64 para Base32
- Cole o Base64 em Entrada · Base64. Caracteres URL-safe (
-,_), preenchimento ausente e quebras de linha não são problema. - Leia o resultado em Saída · Base32 (RFC 4648).
- Para um link
otpauth://ou um app autenticador, desmarque Preenchimento (=) abaixo da saída. - Clique em Copiar saída. Base32 (RFC 4648) → Base64 no seletor de direção converte no sentido inverso, assim como a página Base32 para Base64.
Os bytes no meio do caminho não mudam. Entra uma chave de 20 bytes, sai uma chave de 20 bytes, como mostra o contador Bytes abaixo da ferramenta.
Exemplos
| Base64 | Base32 | Bytes |
|---|---|---|
iEwO+V01Llzjb4MxBUtgEuCNW8o= | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20 |
iEwO-V01Llzjb4MxBUtgEuCNW8o | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20, entrada URL-safe sem preenchimento |
MTIzNDU2Nzg5MDEyMzQ1Njc4OTA= | GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | 20, o segredo de teste da RFC 6238 |
SGVsbG8h3q2+7w== | JBSWY3DPEHPK3PXP | 10 |
As duas strings das primeiras linhas não se parecem em nada, e isso é normal: o Base64 usa 6 bits por caractere e o Base32 usa 5, então os caracteres nunca se alinham.
O erro a evitar é codificar os caracteres do Base64 como texto. Colar iEwO+V01Llzjb4MxBUtgEuCNW8o= num codificador de texto para Base32 dá NFCXOTZLKYYDCTDM…, que é Base32 válido dos próprios 28 caracteres. Os códigos gerados a partir disso nunca vão bater com os do servidor.
Configurando TOTP a partir de um segredo em Base64
O código do servidor muitas vezes guarda o segredo compartilhado em Base64, ou o gera com um comando como este:
openssl rand -base64 20
Para cadastrá-lo num app autenticador, converta aqui e depois monte o URI da chave:
otpauth://totp/Example:alice@example.com?secret=RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K&issuer=Example
algorithm, digits e period podem ser acrescentados como parâmetros; sem eles, os apps assumem SHA-1, 6 dígitos e 30 segundos. Transforme o link em QR code com qualquer ferramenta de QR local, ou deixe o usuário digitar o segredo Base32 à mão. O segredo são os mesmos bytes que o seu servidor passa para o HMAC, então os códigos batem sem nenhuma mudança no servidor.
Se você precisa de um segredo novo em vez de um existente, gere 20 bytes aleatórios em Base64 com o gerador de Base64 aleatório (predefinição Personalizado) e converta aqui.
Comprimentos para tamanhos de chave comuns
| Chave | Base64 | Base32, sem preenchimento | Base32 com = |
|---|---|---|---|
| 10 bytes (80 bits) | 16 | 16 | 16 |
| 16 bytes (128 bits) | 24 | 26 | 32 |
| 20 bytes (160 bits) | 28 | 32 | 32 |
| 32 bytes (256 bits) | 44 | 52 | 56 |
Tamanhos múltiplos de 5 bytes, como 10 e 20, dão Base32 sem preenchimento nenhum.
A mesma conversão em Python
import base64
secret_b64 = "iEwO+V01Llzjb4MxBUtgEuCNW8o="
base64.b32encode(base64.b64decode(secret_b64)).decode().rstrip("=")
# 'RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K'
Para entrada URL-safe, use base64.urlsafe_b64decode e acrescente o preenchimento = antes, se ele tiver sido removido. Mais sobre isso em Base64 em Python.
Perguntas frequentes
Por que apps autenticadores precisam de Base32 em vez de Base64?
O formato de URI de chave otpauth://, que os apps leem dos QR codes, define o segredo como Base32. Ele também precisa poder ser digitado quando o QR code não pode ser escaneado, e o Base32 não tem +, / nem mistura de maiúsculas e minúsculas para confundir.
O segredo em Base32 deve ter preenchimento =?
Não num link otpauth://: o formato de URI de chave diz que o preenchimento deve ser omitido. Desmarque Preenchimento (=). Um segredo de 20 bytes tem 32 caracteres e nem precisa de preenchimento.
Qual deve ser o tamanho de um segredo TOTP?
A RFC 4226 exige pelo menos 128 bits e recomenda 160 bits, ou seja, 20 bytes: 28 caracteres em Base64 ou 32 em Base32.
Converter um segredo para Base32 é um risco de segurança?
A codificação não acrescenta nem tira proteção; qualquer pessoa com a string, em qualquer das duas formas, consegue gerar os seus códigos. O risco está em onde você cola o segredo. Esta página converte no navegador, e a Content Security Policy dela bloqueia requisições de rede que não sejam as do contador de visitas da Cloudflare.