Encriptando Senhas em Python com bcrypt

Mayssa Nogueira
Py-Bcrypt
Published in
2 min readNov 17, 2018

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 hashed
if bcrypt.hashpw(password, hashed) == hashed:
print "It matches"
else:
print "It does not match"

--

--