En este artículo, veremos cómo codificar contraseñas en Python con BCrypt. Almacenar contraseñas en texto sin formato es una mala práctica, ya que es vulnerable a varios intentos de piratería. Es por eso que se recomienda mantenerlos en forma de hash.
¿Qué es hash?
Es un proceso de convertir una string a otra usando una función hash. Hay varios tipos de funciones hash, pero hay algunas similitudes básicas que todas ellas satisfacen: el hash es un proceso irreversible. es decir, la conversión debe ser de una sola manera, la longitud del hash debe ser fija y una string de entrada debe corresponder únicamente con un hash para que podamos compararlos más tarde, esto lo hace ideal para contraseñas y autenticación.
Hash una contraseña en Python usando Bcrypt
Bcrypt es una función de hash de contraseñas diseñada por Nelis Provos y David Mazières. Bcrypt utiliza una criptografía fuerte para codificar y saltear la contraseña basada en el cifrado Blowfish. Para fortalecer el cifrado, podemos aumentar el «factor de costo» para que pueda aumentarse a medida que las computadoras se vuelven más rápidas. También pretende ser lento, para hacer que los ataques de fuerza bruta sean más lentos y más duros.
Para instalar Bcrypt use el comando –
pip install bcrypt
Las funciones en Bcrypt usadas –
- bcrypt.gensalt( ) – Se utiliza para generar sal. Salt es una string pseudoaleatoria que se agrega a la contraseña. Dado que el hashing siempre da el mismo resultado para la misma entrada, si alguien tiene acceso a la base de datos, el hash puede ser derrotado. para esa sal se agrega al final de la contraseña antes del hash. No necesita ningún argumento y devuelve una string pseudoaleatoria.
- bcrypt.hashpw() : se utiliza para crear el hash final que se almacena en una base de datos.
- Argumentos: podemos pasar Salt y Password en forma de código de bytes.
- Valor de retorno: si el hashing es exitoso, devuelve una string hash.
Hashing de contraseñas
Para usar bcrypt, deberá importar el módulo bcrypt. Después de eso, la función bcrypt.hashpw() toma 2 argumentos: una string (bytes) y Salt. La sal son datos aleatorios que se utilizan en la función hash. Vamos a codificar una contraseña e imprimirla en los siguientes ejemplos.
Ejemplo 1:
Python3
import bcrypt # example password password = 'password123' # converting password to array of bytes bytes = password.encode('utf-8') # generating the salt salt = bcrypt.gensalt() # Hashing the password hash = bcrypt.hashpw(bytes, salt) print(hash)
Producción:
Ejemplo 2:
Ahora cambiemos un poco la contraseña de entrada para ver el comportamiento del hashing.
Python3
import bcrypt # example password password = 'passwordabc' # converting password to array of bytes bytes = password.encode('utf-8') # generating the salt salt = bcrypt.gensalt() # Hashing the password hash = bcrypt.hashpw(bytes, salt) print(hash)
Producción:
Comprobación de contraseñas
El siguiente ejemplo compara una contraseña con un valor hash.
Ejemplo 1:
Aquí verificaremos si el usuario ha ingresado la contraseña correcta o no, para eso podemos usar bcrypt.checkpw(contraseña, hash). Al principio, supongamos que el usuario ingresó la contraseña incorrecta.
Python3
import bcrypt # example password password = 'passwordabc' # converting password to array of bytes bytes = password.encode('utf-8') # generating the salt salt = bcrypt.gensalt() # Hashing the password hash = bcrypt.hashpw(bytes, salt) # Taking user entered password userPassword = 'password000' # encoding user password userBytes = userPassword.encode('utf-8') # checking password result = bcrypt.checkpw(userBytes, hash) print(result)
Producción:
Ejemplo 2:
Ahora veamos qué sucede cuando las contraseñas coinciden:
Python3
import bcrypt # example password password = 'passwordabc' # converting password to array of bytes bytes = password.encode('utf-8') # generating the salt salt = bcrypt.gensalt() # Hashing the password hash = bcrypt.hashpw(bytes, salt) # Taking user entered password userPassword = 'passwordabc' # encoding user password userBytes = userPassword.encode('utf-8') # checking password result = bcrypt.checkpw(userBytes, hash) print(result)
Producción:
Publicación traducida automáticamente
Artículo escrito por chandramauliguptach y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA