Como usar
- Escolha o Formato: Hex, Base64url, Base64 ou Alfanumérico. A linha embaixo do seletor diz quais caracteres saem em cada um.
- Ajuste o Tamanho em bytes (de 4 a 256) ou escolha um Uso: ID de sessão, token CSRF ou de link, chave de API, segredo HMAC ou JWT, chave AES. O Uso põe o tamanho recomendado e explica o porquê.
- Se quiser, preencha o Prefixo, como sk_live_: ele vai na frente de cada token e não soma força. Aceita letras sem acento, algarismos, _, - e ., até 32 caracteres.
- Em Quantidade, peça até 100 de uma vez, para um lote de seed de teste; Gerar outros sorteia de novo com as mesmas opções.
- Copie um token pela linha dele, copie todos (um por linha) ou baixe um .txt. O comando No terminal gera o mesmo formato e tamanho fora do navegador. Nada vai para servidor: as opções ficam lembradas neste navegador, os tokens nunca.
Exemplos
Chave de API de 32 bytes em hex
Formato Hex · Tamanho 32 bytes64 caracteres de 0–9 e a–f · 256 bits · muito forte · no terminal: openssl rand -hex 32ID de sessão de 16 bytes em base64url
Formato Base64url · Tamanho 16 bytes22 caracteres de A–Z, a–z, 0–9, - e _ · 128 bits · forte · no terminal: python3 -c "import secrets; print(secrets.token_urlsafe(16))"Chave com prefixo sk_live_ em alfanumérico
Formato Alfanumérico · Tamanho 32 bytes · Prefixo sk_live_43 caracteres por token + 8 do prefixo, que não somam força · 256 bits · muito forte · no terminal: echo "sk_live_$(LC_ALL=C tr -dc 'A-Za-z0-9' </dev/urandom | head -c 43)"Bytes, bits e caracteres
A força de um token vem dos bytes sorteados: cada byte vale 8 bits, então 32 bytes são 256 bits. O formato só muda como esses bytes viram texto: o hex usa 2 caracteres por byte, o Base64 usa 4 a cada 3 bytes e fecha com = quando sobra, o Base64url faz o mesmo sem o =, e o alfanumérico sorteia letras e algarismos, cerca de 5,95 bits por caractere (log₂ 62).
Em hex, Base64url, Base64 e alfanumérico, 16 bytes dão 32, 22, 24 e 22 caracteres; 32 bytes dão 64, 43, 44 e 43; 64 bytes dão 128, 86, 88 e 86. O alfanumérico não fecha em bytes inteiros, então a conta arredonda para cima: o menor número de caracteres com pelo menos os bits dos bytes pedidos, e nenhum token fica mais fraco que o tamanho escolhido.
Por isso o tamanho é em bytes nos 4 formatos: é o que openssl rand e secrets pedem, e o mesmo número de bytes dá a mesma força, qualquer que seja o texto.
Como o token é sorteado
Cada byte sai de crypto.getRandomValues, o gerador criptográfico do navegador, alimentado pelo sistema operacional. Math.random não serve para token: não foi feito para ser imprevisível. No hex, no Base64 e no Base64url o sorteio é de bytes crus, e 256 divide 2^32 sem deixar resto: nenhum sorteio é descartado.
O alfanumérico é diferente: pegar um byte e usar o resto da divisão por 62 erra, porque 256 = 4 × 62 + 8, e os 8 primeiros caracteres, de A a H, sairiam 5 vezes em 256 e os outros 54 só 4, ou seja, 25% mais. Aqui cada caractere usa um sorteio de 32 bits e descarta os valores do fim que sobram da divisão (4 de 4.294.967.296, porque 2^32 mod 62 = 4): os 62 caracteres têm exatamente a mesma chance.
Nada sai do navegador: o token não passa por servidor, não entra na URL nem no armazenamento local. A página publicada também não traz token pronto: o sorteio só começa quando ela abre no seu navegador, então cada visita tem os seus.
Quanto basta para cada uso
A OWASP pede pelo menos 64 bits de entropia no ID de sessão; 16 bytes dão 128 bits e deixam folga. Token CSRF ou de link e chave de API ficam bem com 32 bytes (256 bits). Na chave de API, guarde no servidor só o hash (SHA-256), como se faz com senha.
Para segredo de assinatura, a RFC 7518 pede chave do tamanho da saída do hash ou maior: 32 bytes para HS256 e 64 bytes para HS512. A chave do AES-256 tem exatamente 32 bytes, e o IV é outro valor, sorteado a cada mensagem.
O prefixo (ghp_, sk_live_, xoxb-) identifica o tipo da chave e ajuda as ferramentas de varredura de segredos a achar um vazamento, mas não soma força: quem ataca sabe que ele está lá.
No terminal e no código
No terminal, openssl rand -hex 32 dá 64 caracteres e openssl rand -base64 32 dá 44. Acima de 48 bytes, o openssl quebra o Base64 em linhas de 64 colunas, então o comando da tela acrescenta | tr -d '\n' para juntar tudo numa linha só. No Python, secrets.token_hex(32) dá hex, e secrets.token_urlsafe(32) dá Base64url sem o = e com 43 caracteres: o argumento é em bytes, não em caracteres.
No Node, crypto.randomBytes(32).toString('hex') dá 64 caracteres e crypto.randomBytes(32).toString('base64url') dá 43. Para o alfanumérico no shell, LC_ALL=C tr -dc 'A-Za-z0-9' </dev/urandom | head -c 43 dá 43 caracteres, o equivalente a 32 bytes; sem LC_ALL=C, o tr do macOS para com Illegal byte sequence.
Perguntas frequentes
- Quantos bytes deve ter um token seguro?
- Depende do uso: 16 bytes (128 bits) para ID de sessão; 32 bytes (256 bits) para chave de API, segredo HMAC ou JWT HS256 e chave AES-256; 64 bytes (512 bits) para HS512. Abaixo de 8 bytes o token é fraco, e a ferramenta o marca assim.
- Hex, Base64 ou Base64url: qual usar?
- A entropia é a mesma; o que muda é o texto. Com 32 bytes, o hex tem 64 caracteres, o Base64 tem 44 e o Base64url tem 43. Use Base64url em URL, cookie e header, porque não tem +, / nem =; hex onde só se aceita 0–9 e a–f; e alfanumérico quando o sistema recusa símbolo (43 caracteres para 32 bytes).
- É seguro gerar um token num site?
- Aqui o token sai de crypto.getRandomValues, no seu navegador: não é enviado nem salvo, e o HTML da página não traz nenhum. Mesmo assim, para um segredo de produção o mais prudente é gerar na própria máquina: o comando No terminal faz isso, por exemplo com openssl rand -hex 32.
- Qual a diferença entre token, chave de API e senha?
- A senha é para uma pessoa digitar, então precisa ser lembrada ou guardada num gerenciador. O token é um valor que a máquina lê: sorteado, sem ter de ser digitado nem lembrado. A chave de API é um token de vida longa que identifica o cliente. Para uma senha de pessoa, use o Gerador de senha.
- UUID serve como token?
- Depende da versão. O UUID v4 tem 122 bits aleatórios em 36 caracteres; o v7 guarda o horário e só 74 bits aleatórios, e nunca deve ser usado como segredo. Para um segredo, use 32 bytes daqui, que são 256 bits.
- Como guardar e trocar um token?
- Guarde em variável de ambiente ou num cofre de segredos, nunca no repositório. No servidor, guarde só o hash. Troque o token quando ele vazar ou quando alguém sai do time.