✖

Segurança de senhas

Um atacante que tenta entrar em um aplicativo protegido por senha (um arquivo RAR protegido, um e-mail…) tem várias possibilidades de chegar ao resultado sem conhecer a senha. Algumas delas exigem certa dose de inteligência, esperteza e conhecimento, outras exigem um pouco de sorte e de preparo físico. Então vamos primeiro resumir quais são as possibilidades do atacante.

Como quebrar a senha de alguém

  • Encontrar quem conhece a senha (o dono do e-mail, por exemplo) e conseguir a senha com ele — convencendo-o na conversa, subornando, intimidando. Não vou descrever mais esse método no artigo :-).
  • Tentar arrancar a senha do dono de forma discreta, por exemplo com um e-mail falso; tecnicamente isso se chama phishing. O método consiste em enviar ao dono da conta um e-mail em que você o convida a lhe mandar de volta o nome de usuário e a senha. Depende só de você o quanto a mensagem vai parecer confiável, o pedido sozinho provavelmente não bastaria, é preciso acrescentar uma história. Muitas vezes encontramos a história de que o banco de dados quebrou e por isso pedimos a todos os usuários que digitem de novo a senha e o nome, senão vamos cancelar a caixa de e-mail, e assim por diante. Se a mensagem parece realmente séria, a taxa de sucesso não costuma ser pequena.
  • Ataque de dicionário — baixamos da internet alguns pacotes com as senhas mais comuns e testamos todas. Se tivermos sorte e o dono tiver uma senha mais frequente, realmente a obtemos com facilidade. Daí vem a lição fundamental — não escolha senhas que fazem sentido. Escolha, por exemplo, a senha borboleta, e garanto que o primeiro hacker iniciante vai quebrá-la em poucos segundos. Esse é provavelmente o método mais eficaz: se você tem um dicionário de senhas realmente grande, consegue adivinhar a senha de grande parte dos usuários sem muito esforço.
  • A força bruta é o método mais bobo. Consiste em testar todas as senhas possíveis que existem no mundo. O programa vai montando as letrinhas segundo certo algoritmo e testa se acertou a senha procurada. Quando a encontra, guarda a senha e termina. Vamos examinar esse método a seguir.

Força bruta

Um programa que usa esse método apenas forma diferentes arranjos de palavras e testa se por acaso acertou a senha. Vamos calcular quanto tempo esse teste pode levar.

Suponha que temos uma senha de cinco caracteres, composta só de letras minúsculas do alfabeto (sem acentos nem cedilha, como ã ou ç). O número de letras do alfabeto é vinte e seis. Agora é fácil calcular quantas senhas diferentes podemos formar com cinco dessas letras. Vamos usar arranjos, já que a ordem nos importa (a senha porta não é igual a tropa, embora seja composta pelas mesmas letras) e, além disso, precisamos usar arranjos com repetição, porque as letras podem se repetir nas senhas. E vamos ao cálculo. A fórmula para trabalhar com arranjos com repetição é (AR)n,k = nk. No lugar de n colocamos o número de letras entre as quais vamos escolher — o número de letras do alfabeto — e no lugar de k colocamos o número de letras de que a senha é composta, no nosso caso cinco. Obtemos 265, que é aproximadamente doze milhões de possibilidades diferentes. É muito ou pouco?

Isso depende também da máquina de que dispomos. Um computador antigão consegue fazer poucas comparações por segundo, computadores supermodernos conseguem dez mil vezes mais. Nestes exemplos vou trabalhar com a hipótese de que o computador consegue fazer dez milhões de comparações e avaliações por segundo. Já deve ter ficado claro para todo mundo que uma senha de cinco caracteres seria descoberta por esse computador em até dois segundos, o que realmente não é um resultado positivo. Mas não vamos desistir.

Fortalecendo a senha

Uma senha de cinco caracteres não é segura nem um pouquinho; alguns sistemas mais sensatos nem permitem escolher uma senha tão curta. Diz-se que a senha não deveria ter menos de oito caracteres. Vamos calcular agora quantas possibilidades existem para uma senha de oito caracteres. Como no caso anterior, vamos considerar apenas letras minúsculas do alfabeto. Substituímos na fórmula e obtemos 268, que é aproximadamente duzentos bilhões de possibilidades. Esse número já é mais bonito. O computador avaliaria todas as possibilidades em menos de seis horas. É melhor do que antes, mas vamos ver como a força da senha cresceria se você usasse também letras maiúsculas, algarismos e caracteres especiais, como sublinhados, hifens e assim por diante.

As letras minúsculas são 26, as maiúsculas também são 26, o que dá 52 caracteres no total. A isso ainda precisamos somar 10 algarismos e alguns caracteres especiais. Nem todos os caracteres especiais são permitidos em todo lugar, então, para simplificar, vou contar com apenas oito caracteres especiais, para que o número de caracteres seja arredondado para uns bons 70. O tamanho da senha será novamente oito. Após substituir, obtemos este número: 708, que, para termos uma ideia melhor, é aproximadamente 5,8 · 1014, em palavras, quase seiscentos trilhões de possibilidades. Esse já é um número bastante respeitável. O nosso computador verificaria todas as possibilidades em dezesseis mil horas! O que é pouco menos de dois anos. O atacante precisaria ter muita sorte para descobrir a senha em um tempo realista. Além disso, ele precisaria conhecer o tamanho da sua senha; caso contrário, se não soubesse o tamanho, ainda precisaria verificar as possibilidades com menos letras.

Algumas pessoas temem tanto pelos seus dados que usam senhas numéricas. Essas senhas resistem muito bem ao ataque de dicionário, porque dificilmente haverá em algum dicionário de senhas usadas com frequência justamente 41.274.390.553. Infelizmente, essas senhas, embora resistam ao ataque de dicionário, resistem menos à força bruta. Afinal, os algarismos são apenas dez, o que significa que o número de possibilidades é sempre 10k. A força da senha é mantida apenas pelo seu tamanho. A nossa senha anterior de oito caracteres com todos os tipos de caracteres tinha aproximadamente 5,8 · 1014 possibilidades. Para atingirmos pelo menos o mesmo com uma senha numérica, ela precisaria ter quinze algarismos, quase o dobro de caracteres. Vê-se claramente que é mais eficaz escolher uma senha mais curta, mas com mais tipos de caracteres.

Não subestime o atacante

O atacante pode ser esperto. Depois de ler as linhas anteriores, digamos que você decidiu trocar a sua senha atual “limonada” pelo menos por “Limonada”, com o que o número de possibilidades aumenta várias vezes, porque o atacante já precisa incluir no algoritmo também as letras maiúsculas. Só que o atacante pode supor que a letra maiúscula estará apenas na primeira posição, porque isso é mais fácil de lembrar e não costuma ser hábito ter uma letra maiúscula no meio da palavra. Então ele escreve um algoritmo que verifica todas as possibilidades de palavras com letras minúsculas e, eventualmente, com uma letra maiúscula logo no início.

A sua senha original tinha complexidade (agora me refiro a quantas possibilidades poderia haver ao todo, se mantivéssemos a mesma forma da senha — oito letras minúsculas) 268. Se o atacante não pensasse, a nova senha teria complexidade 528, mas, se ele usasse o algoritmo esboçado acima, a senha teria complexidade 52 · 267. Na primeira posição da senha podem se alternar letras minúsculas e maiúsculas, que são 52 ao todo, e nas outras sete posições podem se alternar apenas letras minúsculas, o que já é um arranjo com repetição comum.

Além disso, o atacante pode, por exemplo, saber que a sua senha é composta de quatro letras e quatro algarismos, sem embaralhar, sempre os números juntos e as letras juntas. Calcularíamos a complexidade dessa senha assim: o primeiro quarteto de letras tem 264 possibilidades, o segundo quarteto, de algarismos, tem 104 possibilidades. Em seguida multiplicamos esses dois resultados: 264 · 104. Se o atacante não soubesse se primeiro vêm os algarismos ou as letras, precisaríamos ainda multiplicar o resultado anterior por dois.