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.
Algumas empresas/sistemas/pessoas não tomam as devidas precauções para proteger a senha que você escolheu.
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.
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)
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]
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.
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()]
In [ ]: