Encriptando Senhas em Python com bcrypt
py-bcrypt é um wrapper Python do código de hashing de senha Blowfish do OpenBSD, conforme descrito em “Um Esquema de Senha Adaptável ao Futuro”, de Niels Provos e David Mazières.
Este sistema hashes de senhas usando uma versão da cifra de bloco Blowfish de Bruce Schneier com modificações destinadas a aumentar o custo de quebra de senha off-line e frustrar a implementação rápida de hardware. O custo de computação do algoritmo é parametrizado, de modo que ele pode ser aumentado à medida que os computadores ficam mais rápidos. A intenção é tornar o comprometimento de um banco de dados de senhas menos provável de resultar em um invasor obtendo conhecimento das senhas em texto simples (por exemplo, usando John the Ripper).
O py-bcrypt requer a partir do Python 2.4. Versões mais antigas podem funcionar, mas o método bcrypt.gensalt () não requer o gerador criptográfico de números aleatórios os.urandom () introduzido em 2.4.
Mais detalhes sobre a biblioteca encontra-se disponível no link http://www.mindrot.org/projects/py-bcrypt/
Antes de usar esta biblioteca devemos realizar a instalação, aqui no artigo foi usado comando para Linux:
$ sudo apt install python-pip
$ pip install bcrypt
Agora vamos testar:
$ python
>>> import bcrypt
>>> hashed = bcrypt.hashpw(“123xyz”, bcrypt.gensalt())
>>>print hashed
>>>2b$12$miMTKamEQQ/Oz8rasurb/OT6a8kDSX.VpxiqUO8axqQVv9gydLRa
Vamos comparar o conteúdo:
>>> bcrypt.hashpw(“1234xyz”, hashed)==hashed
False
>>> bcrypt.hashpw(“123xyz”, hashed)==hashed
True
A senha encriptada pode ser armazenada em banco de dados, evitando assim o comprometimento da senha, assim:
Armazenar na tabela users do database:
hashed = bcrypt.hashpw(password.encode(‘utf8’), bcrypt.gensalt())
users.insert({
“Username”: username,
“Password”: hashed
})
Observe que a senha foi armazenada encriptada.
Abaixo temos o código disponibilizado pela biblioteca:
import bcrypt
# Hash a password for the first time, with a randomly-generated salt
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
# gensalt's log_rounds parameter determines the complexity.
# The work factor is 2**log_rounds, and the default is 12
hashed = bcrypt.hashpw(password, bcrypt.gensalt(10))
# Check that an unencrypted password matches one that has
# previously been hashedif bcrypt.hashpw(password, hashed) == hashed:
print "It matches"
else:
print "It does not match"