Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre una libreria para utilizar la encriptacion de tipo hash.

Anuncios

El modulo hashlib expone una interfaz comun a muchos algoritmos de resumen de mensajes y hash seguros diferentes pero en general una funcion de hash que puede ser usada para mapear datos de un tamaño arbitrario a un dato de tamaño fijo, este es un tipo de encriptacion de una sola via dado que no se espera recuperar el mensaje dado su hash, si bien disponemos de varios algoritmos que pueden ser usados para calcular un hash nosotros podemos averiguar de cuales disponemos, veamos como se realiza:

Nota: 
La diferencia en esos dos términos es simplemente histórica, los algoritmos más antiguos se llamaban resumenes mientras que los algoritmos modernos se llaman hashes.
Anuncios
>>> import hashlib
>>> hashlib.algorithms_available
{'shake256', 'shake_256', 'shake_128', 'sha224', 'ripemd160', 'sha512-256', 'sha3_224', 'blake2s', 'sha1', 'blake2b', 'sha3_256', 'sha256', 'sha3-512', 'sha512-224', 'md5-sha1', 'whirlpool', 'shake128', 'sha512', 'md5', 'blake2b512', 'sha3-256', 'md4', 'sha384', 'sha3_512', 'sha3-224', 'sm3', 'sha3-384', 'sha3_384', 'blake2s256'}
>>>
Anuncios
Nota: 
el resultado de tu equipo puede variar con respecto a este.
Anuncios

La primera linea es la encargada de importar el modulo que necesitamos, luego le pediremos que nos muestre los algoritmos que tenemos disponible por medio de algorithms_available, pero para asegurarnos de cuales son los que realmente funcionan debemos usar la siguiente propiedad:

>>> hashlib.algorithms_guaranteed
{'sha3_512', 'shake_256', 'blake2s', 'sha1', 'blake2b', 'sha3_256', 'shake_128', 'sha512', 'sha256', 'md5', 'sha3_384', 'sha224', 'sha3_224', 'sha384'}
>>>
Anuncios

Ante la duda sino saben con cuales pueden trabajar estos son los que funcionan con el sistema, pasemos a aplicarlo en un ejemplo simple:

>>> h = hashlib.blake2b()
>>> h.update(b'Hasheame')
>>> h.update(b' ahora!')
Anuncios

La primera linea se encarga de crear el objeto hash pero de tipo blake2b, el siguiente paso sera actualizar el mensaje en este objeto por medio de update, en la siguiente linea actualizamos el texto anteriormente cargado, esto es bueno porque no muchas veces tenemos todo el texto a convertir, con todo esto ya lo tenemos codificado, pasemos a verlo:

>>> h.hexdigest()
'fcb4046b08f544e4904c009848d72f7f9744aeedc51b9b6c3d27898402f39329b57e658ff9d352784594a8455f5300029b213434ba240a7da72ab0c0f6642f94'
>>>
Anuncios

Esto que vemos es el resumen en hexadecimal por medio de este metodo, probemos de ver el resumen:

>>> h.digest()
b"\xfc\xb4\x04k\x08\xf5D\xe4\x90L\x00\x98H\xd7/\x7f\x97D\xae\xed\xc5\x1b\x9bl='\x89\x84\x02\xf3\x93)\xb5~e\x8f\xf9\xd3RxE\x94\xa8E_S\x00\x02\x9b!44\xba$\n}\xa7*\xb0\xc0\xf6d/\x94"
>>>
Anuncios

Esta es la representacion del resumen pero en bytes, vamos a ver el tamaño del bloque:

>>> h.block_size
128
>>>
Anuncios

Pasemos a ver el tamaño resultante del resumen del hash:

>>> h.digest_size
64
>>>
Anuncios

Por ultimo podemos ver el nombre del algoritmo:

>>> h.name
'blake2b'
>>>
Anuncios

Pero todo esto lo podemos hacer sobre una sola linea, veamos un ejemplo:

>>> hashlib.blake2b(b'Hasheame ahora!').hexdigest()
'fcb4046b08f544e4904c009848d72f7f9744aeedc51b9b6c3d27898402f39329b57e658ff9d352784594a8455f5300029b213434ba240a7da72ab0c0f6642f94'
>>>
Anuncios

Si lo comparamos con la ejecucion anterior deberia devolver el mismo resultado, con esto tenemos un vistazo muy por arriba pero nosotros podemos personalizar esto, analicemos el siguiente ejemplo:

>>> h = hashlib.blake2b(
...     b'Paga importante', digest_size=16, key=b'llave-secreta',
...     salt=b'random-salt', person=b'tinchicus'
... )
>>>
Anuncios

En este caso pasamos una serie de parametros, el primero sera un mensaje en bytes (no soporta string), despues definimos cual sera el tamaño de nuestro resumen (digest) en lugar de usar el predeterminado, despues pasaremos los siguientes tres:

  • key, es la clave para el cifrado de clave
  • salt, sal para el cifrado aleatorio
  • person, cadena de personalizacion
Anuncios

Dependiendo del tipo de algoritmos varia el tamaño maximo, con esto aclarado veamos el resumen hexadecimal:

>>> h.hexdigest()
'4c6dbaae9870ed10d4017b90f517b82c'
>>>
Anuncios
Anuncios

Como podemos ver nos hizo un resumen mas corto debido al tamaño que le pasamos entre los parametros, gracias al campo salt es uno de los mas utilizados para recuperar el texto por otras comparaciones como por ejemplo para passwords pero si quieren trabajar con passwords deben usar el algoritmo pbkdf2_hmac, esto es asi porque no solo nos permite informar el campo salt sino tambien el numero de iteraciones utilizadas por el propio algoritmo, esto es importante debido a que las computadores cada vez son mas potentes y es recomendable aumentar la cantidad de iteraciones que hacemos a lo largo del tiempo porque esto disminuye la probabilidad de un ataque por fuerza bruta exitoso en nuestros datos, veamos un ejemplo de como utilizarlo:

>>> import os
>>> import hashlib
>>> smb = hashlib.pbkdf2_hmac(
...     'sha256', b'123password123', os.urandom(16), 100000
... )
>>>
Anuncios

Primero importamos a os para poder trabajar con urandom luego, importamos a hashlib, creamos un objeto donde usaremos a pbkdf2_hmac, dentro especificaremos el algoritmo a utilizar, seguido de la clave que usaremos, en el campo que corresponde a salt usamos a urandom para que genere una cadena al azar de 16 bytes y por ultimo pasamos las iteraciones, probemos de ver como es el resumen hexadecimal:

>>> smb.hex()
'59121f468407aafdd9015fa9c797ec65fa03089c3b1dd5834017e1784aea4e4e'
>>>
Anuncios

En resumen, hoy hemos visto el modulo hashlib, hemos visto como ver los algoritmos disponibles, cuales son los que seguro funcionan, hemos visto como crearlo, como ver la informacion generada, como podemos personalizarlo en caso de ser necesario y cual es mas ideal para manejar con contraseñas, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50