Calango Livre - Em busca da senha ideal

Quando você se cadastra em alguma página da internet, você normalmente fornece um usuário e uma senha.


In [ ]:
usuario = 'joao'
senha = '123456'

Em um sistema simples, a sua informação vai ficar guardada exatamente desta forma:


In [ ]:
(usuario, senha)

A facilidade que isto gera é que a função "Esqueci minha senha", se houver, pode enviar exatamente a senha que você escolheu.

O problema é que qualquer pessoa com acesso a este banco de dados também poderá ver a senha que todo mundo cadastrado escolheu.

Lição número 1 - nem todo mundo protege sua senha

Algumas empresas/sistemas/pessoas não tomam as devidas precauções para proteger a senha que você escolheu.

Como posso saber?

Se a página envia a sua senha para seu e-mail no momento em que você a cadastra ou quando você diz que esqueceu, então a empresa está guardando sua senha sem protegê-la e ela pode ser facilmente recuperada, por você ou por qualquer outra pessoa.

Como me protejo?

Não cadastre a mesma senha em todas as páginas que você visita! Use senhas diferentes para diferentes serviços. Na lição 3 há uma dica de como fazer isso de maneira simples.


Ao receber a sua senha, os sistemas que rodam na internet deveriam guardá-la de uma maneira que não possa ser decodificada, como no exemplo abaixo.


In [ ]:
#ocultando uma senha (hash)
import hashlib #referência: http://stackoverflow.com/questions/9594125/salt-and-hash-a-password-in-python

def codifica_senha(senha_exposta):
    gerador_de_senha = hashlib.sha512() #Não faça isso! Use um hash lento como o bcrypt
    gerador_de_senha.update(senha_exposta.encode('utf-8'))
    return gerador_de_senha.hexdigest()[:8] #só o começo, para facilitar a visualização

senha_oculta = codifica_senha(senha)
(usuario, senha_oculta)

Isso me protege?

Não totalmente.

Embora não seja possível decodificar a senha, se o banco de dados do sistema for exposto, alguém pode comparar as senhas codificadas com uma lista de senhas comuns ou palavras em um dicionário.


In [ ]:
#http://www.tecmundo.com.br/senha/11455-as-senhas-mais-usadas-de-todos-os-tempos.htm
#http://gizmodo.uol.com.br/as-25-senhas-mais-comuns-de-2013/
senhas_comuns = '123456 senha jesus macaco euteamo deixaeuentrar flamengo corinthians'.split()

[(senha_comum, codifica_senha(senha_comum)) for senha_comum in senhas_comuns]

Lição número 2 - nenhuma palavra comum é uma senha segura

Pessoas mal intencionadas podem gerar listas de senhas a partir de dicionários (em várias línguas) ou a partir de uma lista de senhas mais utilizadas (obtidas a partir de bancos de dados vazados).

Como me protejo?

Crie senhas a partir de palavras que não existem em nenhuma língua. Misture números com letras e caracteres especiais.


O mecanismo usual que grandes empresas utilizam para proteger as senhas de seus clientes é o "salt" (sal, em inglês). No momento de guardar a sua senha em um banco de dados, o sistema gera um código qualquer para misturar com a sua senha antes de codificar tudo e guardar.


In [ ]:
import base64
import uuid

#gera um código aleatório de 8 caracteres
sal = base64.urlsafe_b64encode(uuid.uuid4().bytes).decode('utf-8')[:8]
sal

O que fica guardado no banco de dados é o usuário, o sal e a senha já "salgada".


In [ ]:
(usuario, sal, codifica_senha(senha + sal))

Você também pode fazer isso com suas senhas! Ao invés de criar uma senha totalmente diferente para cada sistema, você pode criar um tempero próprio.

Lição número 3 - tempere as suas senhas!

Imagine que você precisa criar senhas para comprar passagens em 4 companhias aéreas: gol, tam, avianca e azul. Você pode incorporar à sua senha a quantidade de letras em cada um dos nomes.


In [ ]:
print('(companhia, qtde letras, senha salgada)')
[(cia, len(cia), senha + str(len(cia))) for cia in 'gol tam avianca azul'.split()]

Como gol e tam ambas têm 3 letras, duas senhas ficaram iguais, então este sal está insosso. Que tal adicionar também a primeira letra do nome da companhia aérea?


In [ ]:
print('(companhia, qtde letras, senha salgada)')
[(cia, len(cia), senha + cia[0] + str(len(cia))) for cia in 'gol tam avianca azul'.split()]

Como me protejo, então?

Invente uma forma simples de incorporar à senha o nome do serviço que está acessando. Pode ser um pedaço do nome do site, o dia em que você acessou a primeira vez ou alguma outra coisa que, somada a uma palavra inventada por você, seja única.


In [ ]: