Introducción al Hashing

Edgardo Trujillo
7 min readJul 23, 2021

Supongamos que usted entra en un laboratorio clínico, para realizarse unas pruebas de sangre a pedido de su doctor. Usted llega paga $$ y deja unos tubos con su sangre. Que eventualmente se procesaran en unas máquinas, después obtiene los resultados.

Digamos que el Laboratorio clínico, es una función (termino de las matemáticas). El INPUT es el $$ y la sangre. El OUTPUT son los resultados de sus laboratorios.

(Fig#1)

El hashing es un identificador unico, para algo.

Dicho en otras palabras el hashing, es una función matemática a la cual le damos un input, y nos devuelve un output fijo del mismo tamaño y único para ese input en específico. A ese output también se le conoce como Hash o Message Digest.

(Fig#2) 32 x 4 = 128 bits | (32 caracteres) (4 bits cada carácter) = 128 bits. En ciencias de cómputos se utiliza el termino Nibble, para indicar un carácter que es representado por 4 bits
  • Ese input, pudiera ser una imagen, sonido, texto, un archivo .iso, etc etc.
  • El input puede ser de largo variable. El output va a ser siempre de un tamaño predeterminado e igual pata todos los inputs que entren en la función.
  • El output que ven en la imagen(Fig#2) se encuentra en formato hexadecimal (0–9) (A-F). En el caso de MD5 el hash siempre va a ser de 32 caracteres hexadecimales. La mayoría de las funciones hashing devuelven en formato hexadecimal, NO así todas.
  • Se supone que no sea “posible” revertir el proceso, no se puede obtener el input solamente viendo el output.
  • Sí se encontraran dos inputs diferentes, que producen el mismo hash, entonces tenemos una colisión.
  • Solamente sí cambiamos un bit, o una letra de minúscula a mayúscula, la función nos devolverá un hash diferente. Aunque usted NO lo pueda ver en pantalla un carácter de espacio al final de 123Abc[espacio], produciría otro hash distinto.
(Fig#3)

Cuando decimos, que una función de hash esta rota, significa que ya alguien consiguió alguna técnica para que dos inputs distintos puedan dar el mismo output. En estos momentos las dos funciones rotas son MD5 y SHA-1.

Por ejemplo sí entramos las dos siguientes imágenes en la funcion de MD5, nos devolverán el mismo hash. Vamos a intentarlo, nos dirigimos a http://onlinemd5.com/ y entramos la fotos de James Brown y Barry White, comparamos los resultados.

James Brown.jpg

Barry White.jpg

Veamos otro ejemplo de la vida real. Entramos en kali.org y descargamos Kali 2021.4 en una imagen kali-linux-2021.4-installer-amd64.iso .

Tenemos la computadora con Windows 10 y/o Windows 11, descargamos e instalamos el programa de Hashtab de http://implbits.com/, con el cual cuando tenemos un archivo descargado damos click con el boton derecho del mouse y seleccionamos properties, allí nos aparecerá un “TAB” que dice File Hashes. Nos muestra los hashes de ese archivo en particular. Sí presionamos en donde dice Settings podemos ver una lista de funciones hash en su mayoría (CRC32 no es considerada una función hash).

Mostrando del hash de Kali Linux 2021.4, en el programa de HashTab.
Mostrando del hash de Kali Linux 2021.4,que nos dice en la pagina de Kali.org

Al comparar el SHA256, podemos asegurarnos que ese archivo, no fue modificado. Sí fuéramos a descargar el mismo archivo de thepiratebay.org, (o cualquier otro lugar el cual no confiamos), podemos verificar el hash y asegurarnos que no se ha manipulado, ya sea de forma maliciosa o por error.

Cuando decimos que la función hash tiene:

  • preimage resistance, significa que teniendo el hash, no podemos recrear el input.
  • second preimage resistance, significa que una vez se tiene un hash, se intente de forma predeterminada encontrar otro hash igual, con un input que fue distinto. En este caso se intenta encontrar un hash predeterminado, que ya tu sabes cual es.
  • collision resistance, significa que es difícil encontrar dos inputs diferentes que me den el mismo output. En este caso el hash no es dado, solamente encuentra dos que sean iguales, cualesquiera.

Entre las funciones de hash mas conocidas se encuentran:

A mayor cantidad de bits, mayor es la seguridad de la función de hash, de la misma manera que a unos de estos 2 candados es mas difícil de encontrarle la combinación a uno que a otro ¿Verdad?.

So a mayor cantidad de bits la función es mas segura pero a la misma vez tarda mas en procesar el input, esa es la razón por la cual en algunos casos los desarrolladores escogen SHA-1 teniendo disponibles otras funciones más seguras, tienen que balancear seguridad vs velocidad. ¿A quién le gusta una página lenta?

Otra de las razones por la cual escogen SHA-256 también es porque confían un poco mas en ella que lleva tiempo en el mercado y a sido probada. De hecho el Bitcoin utiliza SHA256 y RIPMED160, para el blockchain. ¿La razón por la cual utiliza ambas? Creo que fue porque el desarrollador trato de jugar lo más seguro posible.

El ETH de Ethereum utiliza la función Keccak-256, y aunque muchos la confunden con SHA3, NO es la misma.

Kali Linux en su version 2021.4, utiliza una función llamada yescrypt, para guardar los hash en el archivo /etc/shadow, archivo el cual solo puede ser visto con permisos de root. Con el commando de cat /etc/shadow, veremos algo así

(Fig#4) edgar:$y$j9T$gzobnXZCSnRYO7p5knk7v0$QMkw5NzSB0cQFTc8/xq88MetzP95jUKDvrC8.E4E5xC:18983:0:99999:7:::

En este caso el OUTPUT de yescrypt, se encuentra en BASE64, con la pequeña modificación que los caracteres de la BASE64 NO son los caracteres estándar del rfc4648. Esa es la razón por la cual existe un (.) punto en el hash.

(Fig#5) La razón de la SAL, es de hacer que un tipo de ataque conocido como Rainbow Table “Tablas de arcoiris”, sea mas difícil de realizar. La sal es generada de forma interna por la funcion de yescrypt. La SAL es de (4 bits por carácter x 22 caracteres) = 88 bits.

Algunos de los identificadores de los hash son los siguientes:

Identificadores del Hash para el archivo /etc/shadow en sistemas operativos de Linux

En palabras cortas en Linux, no te intentan esconder la función de hash utilizada. Sí la estuviesen escondiendo, seria “seguridad por oscuridad”, lo que se ha demostrado con el tiempo que no funciona. Según Claud Shanon el enemigo conoce el sistema. De echo en el sistema operativo Windows utilizaron seguridad por oscuridad, pero hay que tener en cuenta que el Windows viene en desarollo de una epoca que se pensaba distinto, y algunas veces no cambia una que otra cosa por compatibilidad.

En Windows, las cuentas que no tienen contraseña y las cuentas de administrador deshabilitadas, tendrán el siguiente hash NTLM: 31d6cfe0d16ae931b73c59d7e0c089c0. Dependiendo de la versión del sistema operativo, ha cambiado la forma del hash internamente.

Windows XP y Windows Server 2003 aad3b435b51404eeaad3b435b51404ee LM (No tiene contraseña). Un tipo de hash que NO es sensitivo a las mayúsculas y minúsculas.

Windows Vista → hasta antes Windows 10 v1607 -> LM y NTLM usando RC4. El hash NTLM, Sí es sensitivo a las mayúsculas y minúsculas.

Windows 10 desde v1607 → NTLM usando AES

Windows 10 (Cache Logons) MSCASH2, guardados en HKEY_LOCAL_MACHINE\SECURITY\Cache — Domain credentials hashed

Sí usted va a realizar login, en una pagina web entienda que los mas probable también este utilizando el hash ahí.

Para saber si usted ENTRA o NO en esa pagina, lo que se compara es el hashing de la contraseña. En realidad hoy en día el proceso es un poco más complejo, les explico:

A ese hashing de la contraseña le añaden algo llamado “Sal”, para hacer más difícil el ataque del “Rainbow Table”, también utilizan en la sesión de usuario un “nonce” para evitar el ataque del “Replay Attack”, y utilizan el “key Streching”, para hacer mal difíciles los ataques del “Brute Force”.

El hash también se utiliza para encontrar imágenes de pornografía infantil, como también encontrar malware. Pero en este caso se utiliza un tipo de funcion llamada Fuzzy Hash. Osea su labor es exactamente a la inversa del hash, buscar archivos que aunque fueron alterados y modificados, son exactamente los mismos. Un ejemplo de Fuzzy Hash es el PhotoDNA de Microsoft.

Hoy en día compañías grandes de informática utilizan otras técnicas para realizar el login que no son necesariamente verificar el hash en la base de datos. Pudieran estar utilizando un protocolo conocido como el PAKE (Password Authenthicated Key Exchange). Que lo que busca evitar es que para poder validar el login en la pagina, el usuario no tenga que enviar su contraseña por un medio que la data este en transito.

--

--