Google+ Seguidores

sábado, 23 de septiembre de 2017

Algoritmos Hash - Criptografía con Python y HashLib

¿Que son los Hash?

Los hash o funciones hash, son algoritmos que consiguen crear a partir de una entrada de datos, una salida alfanumérica de longitud normalmente fija que representa un resumen de toda la información que se le ha dado.

Un hash es básicamente un proceso criptográfico generado por un algoritmo dedicado a ello, pero se diferencia de el resto de métodos criptográficos en que este no puede descifrarse, es decir con este método no es posible devolver el valor original del valor dado.



¿Que uso puedo darle a las funciones Hash?

Los hash son usados ampliamente en toda internet, los hash nos permiten cifrar los datos con mucha seguridad, ya que si una persona intercepta el código hash, no sabrá el valor original de los datos.

Actualmente cualquier proyecto que requiera el almacenamiento de datos de un usuario hace uso de uno o múltiples algoritmos para llevar a cabo un cifrado, que permite ocultar o proteger determinada información. En la mayoría de los sitios que requieren de un registro las contraseñas son cifradas y se almacena un hash, en lugar del texto original.


El modulo HahsLib.

La libreria estandar de python nos proporciona el modulo hahslib. Este módulo implementa una interfaz común a muchos diferentes algoritmos seguros de hash y digestión de mensajes. Se incluyen los algoritmos de hash seguros FIPS, SHA1, SHA224, SHA256, SHA384 y SHA512 (definidos en FIPS 180-2) así como el algoritmo MD5 de RSA (definido en InternetRFC 1321 ). Los términos "hash seguro" y "resumen del mensaje" son intercambiables. Los algoritmos más antiguos fueron llamados digeridos de mensajes. El término moderno es hash seguro.


Algoritmos de hash:

Hay un método constructor nombrado para cada tipo de hash . Todos devuelven un objeto hash con la misma interfaz simple. Por ejemplo: use sha256() para crear un objeto hash SHA-256. Ahora puede alimentar este objeto con objetos tipo bytes utilizando el update() método. En cualquier momento se puede pedir el resumen de la concatenación de los datos alimentados hasta el momento con los métodos digest() o hexdigest().
Ahora veamos un ejmplo utilizando el tipo de hash, SHA-256.
Un ejemplo para cifrar con SHA-256 e imprimir el resultado en pantalla:


>>> import hashlib
>>> m = hashlib.sha256(b"mensaje")
>>> print(m.digest())
b"]\xb3\xa6(\x06\x10!\x8a\x1c\x0b\xbf\xd9\x9f\x19\x82\x1e{\r$m'\x11\xc9\xf0\xc7\
x9c\x1f\x17\xfdF\xa09"

Si cambiáramos un pequeño detalle de la cadena "mensaje", como por ejemplo, si cambiáramos la m y la colocáramos en mayúscula, el resultado seria totalmente diferente, el hash seria el siguiente.

>>> m = hashlib.sha256(b"Mensaje")
>>> print(m.digest())
b'\xd2\xaf1q.\xad\x04\x14h\xc1\xc6\xfaLvV\\\\\xe0\xf9\xb1\x93\x10\x079\xffQ\xb9\
x07\xe4\xe3\x818'

Como pueden ver, al cambiar un simple detalle, el hash cambia completamente.

Ademas de la familia de funciones sha (Secure Hash Algorithm, Algoritmo de Hash Seguro), la librería hashlib nos proporciona otros tipos de funciones, como MD5, la sintaxis es la misma que la anterior, simplemente cambiamos el nombre de nuestra función de hash, veamos un pequeño ejemplo:


>>> m = hashlib.md5(b"Mensaje")
>>> print(m.digest())
b'&R\xee\xe0\x1d& \xe9\xc5\xe5_j\xc9\xd4\xb43'


La función new() retorna un nuevo objeto de la clase hash implementando la función (hash) especificada. En donde el primer parámetro debe ser una cadena con el nombre de la función hash que se desea utilizar como “sha1”, “md5”, “sha224” y el segundo cualquier tipo de cadena que queramos cifrar. Veamos un ejemplo:

>>> m = hashlib.new("sha256", b"mensaje")
>>> print(m.digest())
b'\xd2\xaf1q.\xad\x04\x14h\xc1\xc6\xfaLvV\\\\\xe0\xf9\xb1\x93\x10\x079\
xffQ\xb9\x07\xe4\xe3\x818'


La función digest retorna la cadena cifrada en binario. Para obtenerla en hexadecimal, existe la función hexdigest().

>>> print(m.hexdigest())
'5db3a6280610218a1c0bbfd99f19821e7b0d246d2711c9f0c79c1f17fd46a039'


La función update() actualiza el objeto hash añadiendo una nueva cadena. Reiteradas llamadas son equivalentes a una sola con la concatenación de las cadenas. Veamos un ejemplo:

>>> m = hashlib.sha256()
>>> m.hashlib.update(b"mensaje")
>>> m.hashlib.update(b"cifrado")
>>> #Es lo mismo que 
>>> m = hashlib.sha256(b"mensaje" + b"cifrado")

Si queremos ver el tamaño del hash en bytes, podemos usar el atributo digest_size, ejemplo:

>>> m = hashlib.sha256(b'mensaje')
>>> print(m.digest_size)
'32'


Los algoritmos shake_128() y shake_256()proporcionan digresiones de longitud variable con length_in_bits // 2 hasta 128 o 256 bits de seguridad. Como tal, sus métodos de digestión requieren una longitud. La longitud máxima no está limitada por el algoritmo SHAKE.

shake.digest( longitud )
Devuelve el resumen de los datos pasados ​​al update()método hasta ahora. Este es un objeto bytes de tamaño lengthque puede contener bytes en el rango entero de 0 a 255.


shake.hexdigest( longitud )
Como digest()excepto que el resumen se devuelve como un objeto de cadena de doble longitud, que contiene sólo dígitos hexadecimales. Esto se puede utilizar para intercambiar el valor de forma segura en el correo electrónico u otros entornos no binarios.


Ejemplo:


>>> m = hashlib.shake_128(b"Mensaje Secreto")
>>> print(m.hexdigest(15))
'bcce4516f5765cd6d54fb10c343169'
>>> print(m.hexdigest(10))
'bcce4516f5765cd6d54f'

Finalización:

Hemos llegado al final, hemos visto lo importantes que son los algoritmos hash en la seguridad de información, si quieres ver más sobre los la libreria hashlib puedes ver la documentacón de python ingresando al siguiente link: https://docs.python.org/3/library/hashlib.html

No hay comentarios :
Write comentarios

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

Powered by Blogger .