Como gerar uma string de caracteres aleatórios em JavaScript? Do simples ao seguro
\n\nImagine: você está escrevendo um formulário de registro e precisa gerar uma senha temporária para um novo usuário. Ou, talvez, você esteja criando um identificador único para uma sessão, uma chave de ativação ou simplesmente um nome de arquivo aleatório no servidor. Em todos esses casos, surge a mesma pergunta: como gerar rápida e seguramente uma string de caracteres aleatórios em JavaScript?
\n\nEsta pergunta é uma das mais populares no Stack Overflow (milhares de visualizações e dezenas de respostas). Mas qual abordagem escolher? Neste artigo, vamos analisar 5 maneiras reais de gerar strings aleatórias, da mais simples à criptograficamente segura, e você entenderá quando usar cada método.
\n\nVamos nessa! 🚀
\n\nMétodo 1: O clássico — Math.random() e toString(36)
\n\nA maneira mais concisa, que frequentemente aparece nas respostas do Stack Overflow, é usar Math.random() junto com toString(36).
Como funciona? Math.random() retorna um número de 0 (inclusivo) a 1 (exclusivo). O método .toString(36) converte esse número em uma string na base 36, ou seja, usa os dígitos 0–9 e as letras a–z. Perfeito para um resultado rápido!
function randomString(length) {\n let result = '';\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n const charactersLength = characters.length;\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n\nconsole.log(randomString(10)); // Exemplo: "a3f8k2m9x1"\n\n\nPrós e contras desta abordagem
\n- \n
- Prós: Simplicidade, clareza, funciona em qualquer navegador e Node.js. \n
- Contras: Não é adequado para criptografia (senhas, tokens).
Math.random()não é criptograficamente seguro — pode ser previsto. \n
Quando usar: Para gerar IDs aleatórios em projetos de estudo, nomes de arquivos ou dados de teste. Para produção, apenas se a segurança não for importante.
\n\nMétodo 2: One-liner curto (mas com ressalva)
\n\nNa internet, é popular este truque:
\n\nconst randomStr = (length) => Math.random().toString(36).substring(2, 2 + length);\nconsole.log(randomStr(8)); // Exemplo: "n4k9v3m2"\n\n\nParece bonito, mas tem um problema. Math.random().toString(36) gera uma string de aproximadamente 11 a 15 caracteres. Se você precisar de 20 caracteres, este método não funcionará. Além disso, continua sendo inseguro.
Conclusão: Bom para protótipos rápidos, mas não para tarefas sérias.
\n\nMétodo 3: Alfabeto estendido e controle de caracteres
\n\nE se você precisar não apenas de letras e números, mas também de caracteres especiais? Ou, ao contrário, precisar excluir caracteres semelhantes (por exemplo, 0 e O, 1 e l)? Para isso, escrevemos nosso próprio gerador com um conjunto flexível de caracteres.
function generateSecureString(length, includeSpecial = false) {\n let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n if (includeSpecial) {\n chars += '!@#$%^&*()_+-=[]{}|;:,./<>?';\n }\n let result = '';\n const charsLength = chars.length;\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * charsLength));\n }\n return result;\n}\n\nconsole.log(generateSecureString(12, true)); // Exemplo: "A3f!k2M9x1#"\n\n\nPor que isso é útil?
\n- \n
- Você mesmo controla o conjunto de caracteres. \n
- Pode excluir caracteres ilegíveis (por exemplo, para códigos de confirmação). \n
- Fácil adicionar suporte para dígitos, letras maiúsculas e minúsculas. \n
Mas lembre-se: Math.random() ainda não é criptograficamente seguro. Para senhas, é melhor usar