Lathack

Función HASH

En este apartado estaremos indagando sobre la importancia y uso de la función Hash dentro de la criptografía, como así también en la seguridad de los datos. Sumado a esto, veremos los algoritmos más utilizados y los distintos tipos de uso que podemos darle.

Función HASH

Introducción

En criptografía una función HASH es aquella que toma datos de tamaño arbitrario como entrada y devuelve un valor fijo de estos, o suma de comprobación (checksum) como salida. Esto quiere decir que no importa el dato a «hashear», ya que el tamaño del output siempre será el mismo.

Función HASH

A diferencia de los algoritmos criptográficos que vimos anteriormente, la función Hash no nos sirve para descifrar el contenido, esto es debido a que a los mismos se los conoce como un algoritmo de one way (unidireccional). Esto quiere decir que no existe una función para descifrar o revertir un hash.

Aplicación del Hash

Para entender la importancia de la función Hash en criptografía, debemos tener en cuenta lo siguiente:

Integridad de datos

La función Hash permite corroborar y cuidar la integridad de un archivo o documento. Cumpliendo de este modo con un pilar fundamental en la Seguridad Informática: La Integridad. Sumado a esto, también se aplica en cuestiones forenses para realizar pruebas de peritaje y contraperitaje, justificando así, la no modificación de la información.

Almacenamiento de Contraseñas

Cuando almacenamos contraseñas en base de datos, veremos que estas no se encuentran en texto plano, sino que se les aplica un Hash. Esto se debe a una cuestión de seguridad, ya que ante una posible amenaza informática, por ejemplo a causa de malware o filtrado de información, no se puedan obtener las credenciales de los usuarios en texto plano.

Propiedades del Hash

Toda función Hash debe cumplir con las siguientes propiedades:

  1. Compresión.

  2. Unidireccionalidad.

  3. Facilidad de Cálculo.

  4. Efecto Avalancha.

  5. Resistencia a Colisiones.

Las primeras dos las mencionamos anteriormente. Por lo tanto, se debe tener en cuenta lo siguiente:

  • Con respecto a la Facilidad de Cálculo, esto refiere a la rapidez y facilidad del algoritmo en generar un hash a partir de un archivo/documente.
  • El Efecto Avalancha significa que si calculamos un Hash sobre un archivo y se modifica parte del mismo, el Hash deberá cambiar al menos la mitad de sus bits con respecto al anterior.
  • La Colisión hace referencia cuando se produce que dos mensajes distintos dan el mismo resultado Hash. Por lo tanto, debe ser difícil encontrar dos mensajes aleatorios, m y m’, tales que r(m)=r(m’) (resistencia a las colisiones).

Esto suele ser confuso ya que, algunas veces no veremos diferencias en dos archivos y pensaremos que son iguales (por ejemplo una imagen). Sin embargo, cuando aplicamos un hash a ambos, veremos que los resultados a nivel bits son distintos.

En caso que esto último no se cumpla, se facilitará el ataque a la paradoja de cumpleaños. La cual establece que de un conjunto de 23 personas, hay una probabilidad del 50,7% de que al menos dos de ellas cumplan años el mismo día. Para 57 o más personas la probabilidad es mayor del 99,666%.

En el siguiente apartado veremos como verificar la diferencia entre un archivo y otro.

Algoritmos de Hash

Entre los algoritmos de una función Hash los más conocidos son:

  • MD5

  • SHA1

  • SHA256

  • SHA512

  • Whirpool

  • Ripemd160

Actualmente los algoritmos MD5 Y SHA1 se encuentran rotos. Es decir, es posible generar un checksum con dos archivos diferentes y, de esta manera, generar una colisión de hash.

Detectar archivos diferentes

Supongamos que tenemos los siguientes archivos: file1.txt y file2.txt

Función HASH

Si bien en el artículo de Verificación con Hash vimos como usar algunos de los algoritmos explicados anteriormente. A continuación haremos uso de la herramienta hexdump para ver la diferencia del bit menos significativo en dichos archivos.

Función HASH

Como podemos ver, es mínima la diferencia de un archivo con respecto a “L” y “l” a nivel bit en su representación ASCII. Por lo tanto, aplicando la suma de una función hash a través del algoritmo sha256 podemos comprobar que ambos son diferentes.

Hash con OpenSSL

Podemos aplicar Openssl para una suma de comprobación en una función hash de dos formas. Por ejemplo a través de pipes (o túnel):

Función HASH

Como vemos, hemos obtenido la función hash de “Ejemplo de Hash” a través de tres algoritmos diferentes como MD5, SHA1 y SHA256.

También podemos aplicar un hash con Openssl a un archivo o documento en particular. Por ejemplo, si queremos enviar un archivo cifrado en la red primero debemos aplicarle un hash como se muestra a continuación:

Como vemos el resultado del Hash es más extenso ya que hemos utilizado sha512 (de 64 bits) a diferencia de la salida que nos proporciona sha256 (de 34 bits).

Uso de Salt

El Hash suele usarse para almacenar las contraseñas de los usuarios en una base de datos. Sin embargo, si dichas contraseñas son débiles o fáciles de descrifrar por ataques de fuerza bruta o diccionario (rainbow table), un atacante podría aprovecharse de las mismas. Para evitar estos casos, el uso de salt es crucial.

La salt es un valor aleatorio de bits que se concatena con otros (es este caso una contraseña) como entrada en una función derivadora de claves (por ejemplo una función hash). La salida se almacena como la versión cifrada de la contraseña. Por lo tanto, cada bit de sal duplica la cantidad de almacenamiento y computación requeridas.

Por ejemplo, si elegimos una clave de una lista de 200.000 palabras (0.2 segundos en ataque por fuerza bruta), al usar salt el número de intentos se elevaría a 860.000.000.000.000 palabras (650 años).

Uso de mkpasswd

Makepasswd hace uso de la librería crypt, hecha en Python, cifrando con salt el archivo o documento que queramos. De esta manera, se vuelve una herramienta muy útil para aplicar seguridad a nuestra información y garantizar su protección.

Veamos el siguiente ejemplo con esta herramienta.

Función HASH

Podemos notar que dicho hash resultante especifica el algoritmo a utilizar, en este caso sha256 ($5$) y la salt entre los signos $ como se ve remarcado en la imagen.

También, podemos observar que cada hash resultante con el mismo archivo es diferente ya que esta herramienta toma un valor aleatorio de salt. Para especificar un valor debemos hacer uso del parámetro -S como se muestra a continuación:

Como vemos, el hash resultante en ambos casos es el mismo ya que el valor de salt no cambia.

Si queremos utilizar otro algoritmo haremos lo siguiente.

Por tanto, podemos ver ver que el primer valor y la longitud del hash resultante cambia.

Uso de OpenSSL

Así como usamos el parámetro -iter correspondiente a pbkdf2 para agregar una capa de seguridad en el apartado de criptografía simétrica y asimétrica, debemos saber que también podemos aplicar y hacer uso de salt. Es decir, para una clave K:

k = pbkdf2(PRF, Pass, Salt, Iter, Size)

Por lo tanto, a través de Openssl, utilizamos la salt de la siguiente manera:

Función HASH

Como vemos, a través del método de encriptación simétrica aes-256-cbc, hemos generado un hash con salt.

HMAC

El código de autenticación de mensajes (MAC) basado en hash (HMAC) es un código que nos permite generar un hash a partir de una clave criptográfica secreta.

Según la RFC2104, HMAC necesita:

  • Llave secreta.

  • Pad interno (ipad) una cadena constante. RFC2104 utiliza el byte 0x36 repetido B veces. Por tanto, el valor de B depende de la función hash elegida.

  • Pad exterior (opad) una cadena constante. RFC2104 utiliza el byte 0x5C repetido B veces.

La fórmula de HMAC se basa en la siguiente fórmula:

H(K,m) = H ( K ⊕ o p a d , H ( K ⊕ i p a d, m ))

En donde:

H: Función hash criptográfica.

K: Es una clave secreta rellena a la derecha con ceros adicionales al

tamaño del bloque de entrada de la función hash, o el hash de la

llave original si es más largo que el tamaño de bloque.

m: Es el mensaje a ser autenticado.

: Denota disyunción exclusiva (XOR).

opad: Relleno exterior.

ipad: Relleno interior.

Para resumir, la operación se vería de la siguiente forma:

(K ⊕ i p a d | m) → sha256 → (K ⊕ o p a d | hash output) → sha256 → HMAC

Por lo tanto, de esta manera, no solo protegemos la integridad de los datos, sino que además estamos agregando otra capa de seguridad con autenticidad y protegiéndolo de ataques de diccionario o Rainbow Tables.

Cálculo de HMAC

Para calcular el hmac de algún archivo podemos utilizar varias herramienta o softwares que nos proveen dicha funcionalidad. En este caso, al igual que en los casos anteriores, utilizaremos openssl cuya línea de comandos en sistemas Linux es la siguiente:

openssl dgst -hash_function -hmac “Key” file

Por ejemplo, supongamos que tenemos el siguiente archivo secret.hash.

Función HASH

Ahora veamos la diferencia entre el HASH y HMAC:

Función HASH

De esta manera, con toda la información vista, podemos deducir que la función de hash no solo es importante para garantizar la integridad de los datos, sino también para agregar autenticidad a los mismos como capa de seguridad a través de HMAC.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

14 + 9 =

Lathack
Scroll al inicio