Hash de contraseña de Python

Salman Mehmood 15 febrero 2024
  1. Contraseña de sal y hash con la biblioteca bcrypt en Python
  2. Hash una contraseña usando la biblioteca hashlib
Hash de contraseña de Python

Aprenderemos sobre el hashing de contraseñas y cómo cifrar una contraseña salt and hash con una biblioteca de terceros llamada bcrypt. También observamos diferentes algoritmos hash de la biblioteca hashlib en Python.

Contraseña de sal y hash con la biblioteca bcrypt en Python

Hashing es el proceso de tomar una cadena y convertirla en una cadena aparentemente aleatoria de una longitud fija, y ese proceso es irreversible. Es una función unidireccional, por lo que no puede devolver el hash a su cadena original como el cifrado, donde puede cifrar un mensaje y luego descifrarlo.

Hashing se utiliza en la gestión de usuarios; por ejemplo, si tenemos alguna brecha en la base de datos o perdemos datos o alguien piratea nuestro sistema cuando usamos una contraseña de texto sin formato. Hashing nos da una capa de protección; sin embargo, la contraseña codificada no se puede descifrar fácilmente si la mantenemos correctamente.

En esta sección, veremos cómo trabajar con contraseñas hash utilizando el módulo bcrypt; sigamos adelante y saltemos al código. Vamos a utilizar una biblioteca de terceros llamada bcrypt, que es un algoritmo hash.

bcrypt es un algoritmo confiable, robusto y recomendado para cifrar contraseñas; nos brinda algunas funciones agradables y fáciles de usar que nos permiten hacer las cosas rápidamente.

Primero, instalaremos esta biblioteca usando el siguiente comando.

pip install bcrypt

Ahora necesitamos importar bcrypt, crear una contraseña y almacenarla en una variable, y la contraseña debe ser una cadena de bytes. Para codificar esta contraseña, crearemos una nueva variable llamada hashed_pswd y llamaremos al método hashpw() desde bcrypt.

Se necesitan dos argumentos; la primera es una contraseña, y la segunda es algo llamado gensalt(), que genera aleatoriamente un número o una contraseña salt and hash.

import bcrypt

My_pswd = b"Mypassword111"

hashed_pswd = bcrypt.hashpw(My_pswd, bcrypt.gensalt())
print(hashed_pswd)

Producción :

b'$2b$12$KEW01pYNDc3ee9U0wZpmgOBpUvvjkig/qxs593hGh/aZ2AvvGTyWu'

Hash una contraseña usando la biblioteca hashlib

Esta sección utilizará la biblioteca hashlib para crear una contraseña salt y hash. Si pasa datos seguros como contraseñas y otras cosas de un lugar a otro, es una buena idea asegurarse de que nadie pueda leerlos.

Hay dos tipos de cosas que puede hacer cuando desea ocultar algo o hacerlo ilegible para el usuario. El primero es hashing y el segundo es cifrado; el cifrado no se utiliza principalmente en las contraseñas.

Si queremos transferir archivos de nuestra computadora a otra o enviar un archivo, entonces usamos el cifrado. Pero, si queremos verificar si la contraseña es correcta o no, o almacenar contraseñas en nuestro servidor, entonces se utiliza principalmente el hash.

Lo mejor de la librería hashlib es que no necesitamos instalar nada; viene con Python 3 o una versión más nueva. Después de importar hashlib, crearemos un objeto llamado MD5_Algo y llamaremos a md5() desde hashlib.

md5 es solo un tipo de algoritmo hash, md significa message-digest y 5 es la versión. Ahora necesitamos la cadena que queremos convertir en texto sin formato en hash, y para esto, llamamos al método update() y escribimos la cadena que queremos convertir en hash.

Luego, dentro de la función print(), llamamos al método hexdigest(); después de convertir la tensión a md5 real, se convierte en una forma hexadecimal.

import hashlib

MD5_Algo = hashlib.md5()
MD5_Algo.update("hello")
print(MD5_Algo.hexdigest())

Este fragmento de código arroja un error (los objetos Unicode deben codificarse antes del hash), y en la sección anterior, ya discutimos que necesitamos convertir una cadena en bytes.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_4064/2416014515.py in <module>
      2
      3 MD5_Algo=hashlib.md5()
----> 4 MD5_Algo.update('hello')
      5 print(MD5_Algo.hexdigest())

TypeError: Unicode-objects must be encoded before hashing

Después de convertir la cadena en bytes, vemos que nos da una contraseña cifrada con hash md5.

import hashlib

MD5_Algo = hashlib.md5()
MD5_Algo.update(b"hello")
print(MD5_Algo.hexdigest())

Producción :

5d41402abc4b2a76b9719d911017c592

hashlib.sha512()

También hay otros tipos de hash encriptados; averigüemos qué tipo de hash hay realmente dentro de Python. Podemos imprimir los algoritmos disponibles usando el atributo algorithms_disponible.

print(hashlib.algorithms_available)

Producción :

{'md4', 'md5', 'shake_256', 'shake_128', 'sha512_224', 'md5-sha1', 'sha224', 'sha3_512', 'sha1', 'sha3_384', 'sha512', 'sha3_224', 'sha512_256', 'sha384', 'sha256', 'blake2b', 'sha3_256', 'blake2s', 'ripemd160', 'whirlpool', 'sm3', 'mdc2'}

Como podemos ver, hay muchos algoritmos geniales y, obviamente, todos estos objetos tienen el mismo tipo de estructura, tendrán las mismas funciones y variables, pero es solo un algoritmo diferente.

sha512 es el que usaremos y pasaremos en una cadena; después de eso, usamos hexdigest() para esa cadena, que será codificada.

import hashlib

MD5_Algo = hashlib.sha512(b"hello")
print(MD5_Algo.hexdigest())

Cuando ejecutamos este código, obtenemos una gran cantidad de caracteres.

9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

sha512 es más fuerte y mejor que sha1; todo depende del escenario que determines como mejor o mejor en tus circunstancias.

Salazón y Hashing

El problema con este tipo de algoritmos antiguos es que pueden ser de fuerza bruta o de ingeniería inversa, y no es tan seguro porque todos pueden descifrar este hash cifrado fácilmente. Nuestro hash cifrado es hola; ¿Qué pasa si hacemos un ataque de diccionario y lo desciframos del diccionario sha512?

sha512

La desventaja de sha512 es que muchas personas usan sus contraseñas en Facebook u otras aplicaciones; por lo general, usan sus cumpleaños que ya se han invertido y mirado en sha512, por lo que no es una forma segura.

Una de las formas más seguras es la salazón; la salazón agrega algo de carácter frente a su cadena original. Digamos que si añadimos "a" delante de "hola", hemos añadido el carácter "a" como sal delante de nuestra cadena original.

hashlib.sha512(b"helloa")

Ahora hemos cifrado este hash con esta sal adicional, por lo que será muy difícil para los piratas informáticos y otras personas que intenten descifrar cómo descifrar el hash, por lo que ahí es donde entra la sal.

hashlib.pbkdf2_hmac()

En Python, la biblioteca hashlib tiene una función que es un poco lenta pero bastante buena llamada pbkdf2_hmac(). Usaremos esta función y la segunda biblioteca es en realidad para convertir el binario a caracteres ASCII.

El pbkdf2_hmac() requiere un par de parámetros; el primer parámetro es el nombre del algoritmo que usaremos, por lo que estamos usando sha512 en este caso. El siguiente es la contraseña o el texto que queremos codificar; en este caso será "hola".

El siguiente se llama sal, la sal se agregará a esta contraseña y luego se cifrarán usando sha512. Y el último es el número de iteraciones; si hacemos esta iteración cien mil veces, entonces va a ser muy difícil encontrarlo para descifrarlo.

En la última línea de código, convertimos el hash encriptado a un carácter ASCII usando el método hexlify() de la biblioteca binascii.

import hashlib
import binascii

Enc_Salt = hashlib.pbkdf2_hmac("sha512", b"hello", b"a", 100000)
print(binascii.hexlify(Enc_Salt))

Producción :

b'40b5957a2d2f5aebcdd878a04e644215d4f3aba3f11c00a1f24e75f8ea2efa11611b2a923a9050832cb768a3a3ad282011cab524b741d392c664b8efbb5f389f'

Ahora podemos ver que el diccionario sha512 no puede descifrarse.

sha512 no puede descifrar

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn