Por que a chave TOTP usa Base32 em vez de Base64?
Porque Base32 é case-insensitive e usa só 32 símbolos sem os pares ambíguos 0/O e 1/I/L, o que importa quando a chave precisa ser digitada manualmente num app, não só escaneada por QR code. Base64 é case-sensitive e inclui + e /, símbolos que complicam a digitação e a leitura em voz alta.
A chave de exemplo JBSWY3DPEHPK3PXP é segura para usar de verdade?
Não. Ela decodifica para apenas 10 bytes, 80 bits, abaixo dos 128 bits que o RFC 4226 exige como mínimo para o segredo compartilhado. É o exemplo didático do próprio RFC, feito para ilustrar a estrutura, não uma chave que um serviço real deveria gerar; serviços sérios geram pelo menos 160 bits (20 bytes).
Por que o código TOTP muda a cada 30 segundos e não a cada uso?
Porque RFC 6238 define o contador como o horário Unix atual dividido por 30 e truncado para baixo, não um contador incremental como no HOTP puro (RFC 4226). Isso significa que servidor e app chegam ao mesmo código de forma independente, sem sincronizar chamadas entre si, desde que os dois relógios estejam alinhados.