FlowingDev

Senhas, explicadas: a chave digital que pode ser um graveto ou uma porta de cofre de banco

Aprenda como senhas fortes e aleatórias são criadas, por que são cruciais para a segurança, e como a entropia e os conjuntos de caracteres transformam uma bagunça de letras em uma fortaleza digital.

Testar a ferramenta: Gerador de Senhas

Em uma frase

Um gerador de senhas cria uma string de caracteres tão aleatória que é praticamente impossível para um computador adivinhá-la, mesmo com bilhões de tentativas por segundo.

O problema que ele resolve

Humanos são máquinas ambulantes e falantes de criar padrões. Somos ótimos em encontrar atalhos, ver rostos em nuvens e lembrar melodias. Somos, no entanto, absolutamente péssimos em criar aleatoriedade.

Quando nos pedem para criar uma senha, nossos cérebros recorrem ao que conhecem: nomes de animais de estimação (totó1), datas importantes (NiverMae1965!), times do coração (VaiCorinthians2024) ou padrões de teclado (qwerty12345). Achamos que estamos sendo espertos ao trocar um o por um 0 ou adicionar um ponto de exclamação no final, mas estamos apenas seguindo um padrão um pouco mais complexo, mas ainda assim previsível.

Isso era aceitável nos primórdios da computação. Mas à medida que o poder de processamento explodiu, os atacantes automatizaram o jogo de adivinhação. Eles construíram ferramentas para tentar cada palavra do dicionário (um "ataque de dicionário"). Depois, adicionaram números, substituições comuns e caracteres especiais. Hoje, uma GPU moderna pode fazer bilhões de tentativas por segundo. Uma senha como S3nh@F0rt3! pode parecer complexa para um humano, mas para um computador, é uma presa fácil que pode ser adivinhada em minutos, se não segundos.

O problema que um gerador de senhas resolve é o problema do "cérebro humano". Ele terceiriza o trabalho de criar uma chave secreta para uma máquina que não tem preconceitos, nem nomes de animais de estimação favoritos, e nenhum conceito do que "parece aleatório". Ele apenas segue princípios matemáticos para produzir uma string que é, para todos os efeitos práticos, puro ruído — e esse ruído é uma sinfonia para um desenvolvedor consciente da segurança.

Como funciona por baixo dos panos

Um bom gerador de senhas não está apenas juntando teclas aleatoriamente. É um processo cuidadoso e calculado, enraizado no conceito matemático de entropia. Pense nele como uma máquina de rolar dados de alta tecnologia.

O Ingrediente Secreto: Entropia

Em criptografia, entropia é uma medida de imprevisibilidade ou aleatoriedade. Alta entropia significa que um valor é muito difícil de adivinhar; baixa entropia significa que é previsível. Sua data de nascimento tem baixa entropia. O resultado de 100 lançamentos de moeda tem alta entropia.

Um gerador de senhas precisa de uma fonte de aleatoriedade de alta qualidade para fazer seu trabalho. Em um navegador moderno, essa fonte é tipicamente a Web Crypto API, especificamente uma função como crypto.getRandomValues(). Este não é o Math.random() do seu avô. Em vez de usar um algoritmo simples e previsível, ele acessa o "pool" de entropia do sistema operacional. Esse pool é um caldeirão de caos, mexido com entradas imprevisíveis como:

  • O tempo preciso dos movimentos e cliques do seu mouse
  • O ritmo da sua digitação
  • Ruído de dispositivos de hardware (como a ventoinha ou o disco rígido)
  • Temporização de pacotes de rede

O navegador usa esse gerador de números pseudoaleatórios de nível criptográfico (CSPRNG) para obter um fluxo de números que são imprevisíveis o suficiente para fins de segurança. Esta é a matéria-prima para nossa senha.

Construindo o Conjunto de Caracteres

Em seguida, o gerador define o "alfabeto" do qual pode escolher. Não é apenas de A a Z. É o conjunto completo de caracteres que você permitiu. Uma configuração típica se parece com isto:

  • Minúsculas: abcdefghijklmnopqrstuvwxyz (26 caracteres)
  • Maiúsculas: ABCDEFGHIJKLMNOPQRSTUVWXYZ (26 caracteres)
  • Números: 0123456789 (10 caracteres)
  • Símbolos: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ (32 caracteres)

Se você habilitar todos os quatro conjuntos, seu conjunto de caracteres (N) terá um tamanho de 26 + 26 + 10 + 32 = 94 caracteres possíveis. O tamanho deste conjunto é um fator crítico na força final da senha.

Rolando os Dados: O Algoritmo

Com uma fonte de números aleatórios e um conjunto de caracteres, o processo é surpreendentemente simples:

  1. Obtenha um número aleatório: Peça ao CSPRNG um número aleatório entre 0 e 93 (o tamanho total do nosso conjunto de caracteres menos um).
  2. Escolha um caractere: Use esse número como um índice para escolher um caractere do conjunto. Por exemplo, se o número aleatório for 74, e o caractere 74 em nosso conjunto for &, então & é o primeiro caractere da nossa senha.
  3. Repita: Faça isso repetidamente para o comprimento (L) desejado da senha.

Um exemplo simplificado em pseudo-JavaScript poderia ser assim:

function generatePassword(length, characterPool) {
  let password = "";
  const poolSize = characterPool.length;

  // Get an array of random numbers in one go for efficiency
  const randomValues = new Uint32Array(length);
  window.crypto.getRandomValues(randomValues);

  for (let i = 0; i < length; i++) {
    // Use the random number to pick a character from the pool
    const randomIndex = randomValues[i] % poolSize;
    password += characterPool[randomIndex];
  }
  return password;
}

const allChars = "abc...XYZ...123...#$!..."; // Pool of 94 chars
const myStrongPassword = generatePassword(16, allChars);
// Result: something like "9k&vB$@p!Z*rE#wJ"

A chave é garantir uma distribuição uniforme — cada caractere no conjunto deve ter a mesma chance de ser selecionado para cada posição na senha.

Medindo a Força: Bits de Entropia

Então, quão forte é o resultado? Medimos isso em "bits de entropia". A fórmula é log₂(Total de Combinações). O número total de combinações é o tamanho do conjunto de caracteres (N) elevado ao comprimento da senha (L), ou N^L.

A fórmula para bits de entropia é: H = L * log₂(N)

Vamos ver como isso funciona na prática.

Comprimento (L) Conjunto de Caracteres (N) Combinações (N^L) Bits de Entropia (H) Tempo para Quebrar (a 10¹² tentativas/seg)
8 Apenas minúsculas (26) 208 bilhões ~37.6 Milissegundos
8 Todos os caracteres (94) 6 quatrilhões ~52.4 Minutos
12 Todos os caracteres (94) 4.7 x 10²³ ~78.7 Milhares de anos
16 Todos os caracteres (94) 3.7 x 10³¹ ~104.9 Trilhões de anos
24 Todos os caracteres (94) 2.3 x 10⁴⁷ ~157.3 Efetivamente para sempre

Como você pode ver, cada caractere que você adiciona ao comprimento não apenas soma força — ele a multiplica. Esse crescimento exponencial é o motivo pelo qual uma senha de 16 caracteres não é apenas duas vezes mais forte que uma de 8 caracteres; ela é sextilhões de vezes mais forte. Esta é a espinha dorsal matemática da segurança de senhas.

Histórias do mundo real

A Cascata "Senha123"

Uma desenvolvedora júnior, vamos chamá-la de Alex, estava gerenciando uma dúzia de serviços para um novo projeto: GitHub, um provedor de servidor na nuvem, um serviço de banco de dados e várias ferramentas de monitoramento SaaS. Para simplificar, ela usou uma senha que conseguia lembrar: NomeDoProjeto2023!. Parecia segura o suficiente. Um dia, o obscuro "serviço de software de fórum" que ela usou para rastrear um bug anunciou um vazamento de dados. O banco de dados de usuários, incluindo senhas com hash, foi exposto. Infelizmente, eles usavam um algoritmo de hash fraco e, em poucas horas, crackers reverteram os hashes para texto puro. Os atacantes então executaram scripts automatizados, tentando os combos de email:senha vazados nos principais serviços. Eles tiraram a sorte grande com a conta da Alex. Sua senha NomeDoProjeto2023! deu a eles acesso ao seu provedor de nuvem e repositório do GitHub. Eles copiaram o código-fonte e os dados dos clientes, e depois limparam os servidores.

Lição: A reutilização de senhas é uma bomba-relógio. Um vazamento em qualquer lugar se torna um vazamento em todos os lugares. Cada serviço precisa de uma senha única e gerada aleatoriamente.

O Ataque de Força Bruta que Bateu e Voltou

Um sysadmin chamado Ben estava fortalecendo um novo servidor SSH público. Este servidor era um alvo tentador, e ele sabia que seria escaneado por bots no minuto em que ficasse online. Para a conta de usuário root (que ele planejava desabilitar para login externo de qualquer maneira), ele nem tentou pensar em uma senha. Ele gerou uma string de 32 caracteres completamente sem sentido usando todos os conjuntos de caracteres: algo como q#8v...G@z7. Uma semana depois, curioso, ele inspecionou os logs de autenticação do servidor. Ele encontrou uma visão horripilante: milhões de tentativas de login falhas de endereços IP de todo o mundo. Os bots estavam executando um ataque de força bruta implacável, tentando senhas comuns, palavras do dicionário e caracteres sequenciais. Mas contra sua fortaleza de 32 caracteres, era como atirar pedrinhas em uma montanha. Eles nunca chegaram nem perto.

Lição: Sua primeira linha de defesa contra ataques automatizados e indiscriminados é uma senha tão complexa e longa que quebrá-la por força bruta é matematicamente inviável.

A "Vitória Fácil" do Pen-Tester

Maria, uma pen-tester, foi contratada para avaliar a segurança de uma empresa de médio porte. Ela começou com "engenharia social" e reconhecimento. Enquanto caminhava pelo escritório em uma visita guiada, ela observou discretamente os espaços de trabalho das pessoas. Escondido na lateral de um monitor estava um Post-it com Inverno2024$. Pertencia a alguém da contabilidade. Essa senha seguia o padrão "humano" clássico: uma palavra comum, a estação/ano atual e um símbolo no final. Era uma senha projetada para atender a uma política (Deve incluir uma maiúscula, um número, um símbolo) enquanto ainda era memorável. Para Maria, foi uma porta aberta. Ela a usou para fazer login no software financeiro da empresa, provando que poderia ter acessado e manipulado dados sensíveis.

Lição: Mesmo seguindo uma política de senhas, os humanos criam senhas previsíveis. A verdadeira aleatoriedade de um gerador remove o elemento humano, que muitas vezes é o elo mais fraco.

Erros e armadilhas comuns

  • Confiar em um gerador suspeito. Tenha cuidado com sites aleatórios que oferecem geração de senhas. Um site malicioso pode estar registrando todas as senhas que cria. Use ferramentas confiáveis, de código aberto ou aquelas que rodam inteiramente no seu navegador, onde o código não pode "ligar para casa".
  • Sacrificar a aleatoriedade pela memorização. Se você gera uma senha e depois a "ajusta" para ser mais fácil de lembrar, você desfez todo o propósito. Você acabou de reinjetar o padrão humano previsível que os atacantes exploram.
  • Ignorar o conjunto de caracteres. Uma senha de 20 caracteres feita apenas de números (27182818284590452353) é vastamente mais fraca do que uma senha de 12 caracteres usando letras, números e símbolos. O tamanho do conjunto de caracteres (N) é um poderoso multiplicador de força.
  • Armazenar a senha gerada de forma insegura. Gerar 4tG!p$z#qR@... é o primeiro passo. O segundo é armazená-la com segurança. Escrevê-la em um Post-it, salvá-la em senhas.txt na sua área de trabalho ou enviá-la para si mesmo por e-mail anula o propósito. Use um gerenciador de senhas confiável.
  • Reutilizar sua única senha "inquebrável". Você gera uma senha fantástica de 25 caracteres. Fica tão orgulhoso dela que a usa para seu e-mail, seu banco e suas redes sociais. No momento em que qualquer um desses serviços sofrer um vazamento, sua chave "inquebrável" estará nas mãos de atacantes, e todas as suas contas estarão vulneráveis.

Por que isso deve estar no seu radar

Se você programa, você gerencia segredos. Ponto final. Seja uma string de conexão de banco de dados, uma chave de API para um serviço de terceiros, um login de servidor ou a conta de administrador padrão do aplicativo que você está construindo, você está constantemente criando e manuseando chaves digitais.

Um desenvolvedor deve recorrer a um gerador de senhas sempre que precisar criar um segredo que outra máquina pode tentar adivinhar. O cérebro humano é para lógica, criatividade e resolução de problemas. Não é para gerar strings aleatórias de nível criptográfico. Ao entender e usar geradores de senhas corretamente, você substitui uma grande fraqueza humana por uma certeza matemática. É uma das práticas de segurança mais simples e eficazes que você pode adotar. Não se trata apenas de proteger suas próprias contas; trata-se de construir sistemas seguros para seus usuários desde o início.

Aprofunde-se

  • NIST Special Publication 800-63B: As diretrizes oficiais do Instituto Nacional de Padrões e Tecnologia dos EUA sobre identidade digital, incluindo a abordagem moderna sobre políticas e força de senhas.
  • MDN Web Docs: The Web Crypto API: Um mergulho profundo na API nativa do navegador para operações criptográficas, incluindo crypto.getRandomValues().
  • OWASP Password Storage Cheat Sheet: Um recurso essencial do Open Web Application Security Project sobre como lidar corretamente com senhas no lado do servidor (depois de gerá-las).
  • Wikipedia: Força da senha: Uma visão geral completa dos conceitos, incluindo cálculo de entropia e análise de ataques de força bruta.
  • Cloudflare: How we built a password generator: Um ótimo artigo do mundo real sobre as considerações envolvidas na construção de um gerador de senhas seguro e de alta qualidade.

Teoria feita. Hora de pôr a mão na massa — 100% no seu navegador.

Testar a ferramenta: Gerador de Senhas