Ferramenta de senhas Voltar ao gerador

Guia de segurança

Por que Math.random não é seguro para senhas

Saiba por que Math.random é adequado para efeitos de UI, mas não para senhas, códigos de redefinição, tokens ou outros segredos sensíveis à segurança.

Resumo

Math.random() é uma função pseudoaleatória geral do JavaScript. É útil para animações, comportamento aleatório de UI, exemplos, jogos e simulações. Não é especificada para segurança criptográfica e não deve ser usada para gerar senhas, códigos de redefinição, segredos de API, chaves de assinatura ou tokens de recuperação.

O problema

Um gerador de senhas precisa de imprevisibilidade contra um atacante, não apenas valores que pareçam variados para um usuário. Math.random() não fornece uma garantia de segurança criptográfica padrão do navegador, e as implementações podem diferir entre mecanismos.

A opção mais segura no navegador

Navegadores modernos fornecem crypto.getRandomValues() através da Web Crypto API. O PwdGen usa essa interface e amostragem por rejeição, que evita seleção tendenciosa de caracteres. Se essa API não estiver disponível, o comportamento seguro é parar a geração e explicar o requisito de compatibilidade.

Como revisar um gerador

Pesquise no código-fonte por Math.random. Um gerador de senhas sério não deve usá-lo para caracteres de senha. Ele pode aparecer na documentação explicando por que não é seguro, mas não no caminho de geração.

Orientação detalhada

Este guia foca em por que Math.random é inadequado para senhas e segredos. É escrito para desenvolvedores, estudantes e usuários de ferramentas que verificam se um gerador usa aleatoriedade segura, então o objetivo prático não é criar uma alegação dramática de segurança. O objetivo é escolher um hábito de senha que sobreviva ao uso diário: formulários de login, gerenciadores de senhas, teclados móveis, recuperação de conta, dispositivos compartilhados e serviços ocasionais com regras de validação estranhas. Uma recomendação segura só é útil se uma pessoa real puder segui-la consistentemente.

O ponto de partida mais seguro é aleatoriedade mais exclusividade. Aleatoriedade significa que o valor é selecionado de um espaço grande por uma fonte aleatória criptograficamente adequada, não inventado a partir de um aniversário, nome de animal de estimação, padrão de teclado ou citação favorita. Exclusividade significa que a mesma senha não é usada em nenhum outro lugar. Uma senha longa, mas reutilizada, pode falhar rapidamente após uma violação não relacionada, enquanto uma senha aleatória exclusiva limita o dano à única conta onde foi usada.

Para este tópico, uma predefinição prática é crypto.getRandomValues com amostragem por rejeição em vez de Math.random. Você pode aplicar essa predefinição com o guia da Web Crypto API e depois armazenar o valor final em um gerenciador de senhas confiável. O PwdGen gera valores localmente no navegador com Web Crypto; a senha gerada não é enviada para um servidor PwdGen. Esse design local reduz a exposição no lado do servidor, mas não protege contra todas as ameaças. Uma extensão de navegador maliciosa, um dispositivo comprometido, uma página de phishing ou manuseio inseguro da área de transferência ainda podem expor um segredo após sua geração.

Os problemas mais comuns a evitar são sequências pseudoaleatórias previsíveis, viés de módulo, funções aleatórias personalizadas e código de demonstração copiado para produção. Esses problemas importam porque os atacantes raramente precisam forçar todas as senhas possíveis quando os hábitos humanos lhes dão um atalho. Credential stuffing, phishing, listas de senhas vazadas e abuso de recuperação de conta são frequentemente mais realistas do que uma busca matemática pura. É por isso que o melhor conselho combina qualidade da senha com controles no nível da conta, como MFA, chaves de acesso, armazenamento de códigos de recuperação e revisão regular do e-mail ou telefone de recuperação.

Use esta lista de verificação ao aplicar a recomendação:

Se um site rejeitar a configuração ideal, não force a senha a um padrão mais fraco manualmente. Ajuste uma variável de cada vez. Se símbolos forem rejeitados, mantenha maiúsculas, minúsculas e números ativados e aumente o comprimento. Se o comprimento máximo for baixo, use o maior comprimento aceito e certifique-se de que o valor seja exclusivo. Se uma senha precisar ser lida em voz alta, impressa ou digitada em uma tela de televisão ou roteador, considere excluir caracteres confusos e aumentar o comprimento para compensar o alfabeto menor.

Finalmente, lembre-se do limite do conselho sobre senhas. Uma senha forte é uma camada de defesa, não uma garantia. Ela não pode tornar uma página de phishing segura, corrigir malware ou compensar um serviço que armazena credenciais de forma inadequada. O hábito útil é chato, mas durável: gere um valor exclusivo, armazene-o com segurança, proteja o caminho de recuperação e substitua-o rapidamente se suspeitar de exposição.

Um próximo passo seguro

Após ler este guia, faça uma pequena auditoria de conta em vez de tentar consertar tudo de uma vez. Escolha a conta que causaria mais problemas se fosse assumida, confirme que sua senha é exclusiva e verifique o e-mail de recuperação, telefone de recuperação, método MFA e armazenamento de código de backup. Se qualquer parte dessa cadeia for fraca, melhore essa parte antes de passar para contas de menor risco. Essa ordem mantém o trabalho gerenciável e protege as contas que os atacantes têm mais probabilidade de usar como trampolim. Para por que math.random não é seguro para senhas, o melhor resultado é um hábito repetível: gere localmente, armazene com cuidado e evite reutilização.

Perguntas frequentes

Math.random é aceitável em algum caso?

Sim, para efeitos visuais, simulações e aleatoriedade comum de UI, mas não para credenciais ou tokens de segurança.

O que os geradores de senha devem usar em vez disso?

Eles devem usar uma fonte aleatória criptográfica como crypto.getRandomValues() no navegador.

O PwdGen usa Math.random como fallback?

Não. Se o Web Crypto não estiver disponível, o PwdGen mostra um aviso de compatibilidade e não gera senhas com Math.random().

Fontes