HASHING

Smart Contracts

Esta es otra área donde se usan mucho las funciones de hashes. Las blockchains como Bitcoin, EthereumNEO o TRON hacen uso de contratos inteligentes para potenciar distintas aplicaciones. Estas aplicaciones son manejadas por un contrato público entre partes. Sin embargo, muchos de estos datos son muy sensibles, o simplemente es demasiada información para ser almacenada en una blockchain. Por lo que la mejor forma de solventar estos escenarios es a través de funciones de hash. De esta manera, todo el contrato es público pero información enlazada o que se quiere mantener privada no es publicada. Estos datos pueden incluir nombres, direcciones, direcciones de monederos, datos de terceros participantes. Es decir; información privilegiada y solo de interés entre partes.

Los hashes también son usados para versionar los contratos. Es decir, un contrato público tiene un hash único que viene dado por lo que dice el contrato. Si el contrato es modificado, el contrato anterior es terminado y se genera uno nuevo con un nuevo hash. De esta manera el hash determina el contrato correcto a usar dentro de aplicación descentralizado facilitando su control. Otro uso de las hash en contratos inteligentes es; para marcar la validez y autenticidad del mismo. Un ejemplo puede ser; un contrato hecho para la venta de una casa con un pago hecho en criptomonedas. La realización del contrato y su hash serán testigos inalterables de venta realizada entre las partes.

¿Para qué sirven estos códigos?

Como estos códigos representan un valor único para cada documento, sus usos pueden verse en infinidad de operaciones:

  • Firma electrónica: asegura la identificación de un documento de forma inequívoca y la no modificación del mismo después de la firma. El hash antes de la firma y el que se genera después de la misma deben coincidir lo que supone un gran beneficio para la seguridad de la operación.
  • Antivirus: para saber si un archivo es malicioso (malware) utilizan, de forma exclusiva, los códigos hash.
  • Gestor de contraseñas: servicios como Google, a la hora de guardar nuestras contraseñas, lo hacen mediante código hash en un texto que no sea plano, lo cual le dará más seguridad y privacidad a nuestras claves.
  • Criptomonedas: se utiliza en todas las operaciones derivadas de la tecnología blockchain. Poder crear seguridad, privacidad y transacciones fiables gracias a los hash es una clara ventaja.

Tipos de hash más usados

La actualización constante en el mundo tecnológico es algo prácticamente obligatorio. Es por ello por lo que la creación de código hash ha ido desarrollando diferentes sistemas para mejorar, sobre todo, en seguridad.

A continuación, vamos a ver los tipos de hash más utilizados en nuestros tiempos:

  • MD5 (Message-Digest Algorithm 5) → su función principal es detectar que ningún archivo haya sido modificado
  • MySQL → es un software creado por Oracle con el que se pueden gestionar bases de datos
  • SHA → permite dificultar la obtención de una cadena de origen con el mismo contenido que la cadena de salida, evitando así el duplicado de datos y la inseguridad de los archivos.

¿Hashing?

¿Qué podemos hacer con el hashing?

Hashing se utiliza para 2 propósitos principales en ciberseguridad. Para verificar la integridad de los datos, o para verificar contraseñas.

Hashing para verificación de contraseña

La mayoría de las aplicaciones web necesitan verificar la contraseña de un usuario en algún momento. Almacenar estas contraseñas en texto sin formato sería malo. Probablemente hayas visto noticias sobre empresas a las que se les filtró su base de datos. Esto como imaginarás puede ser un problema para aquellas personas que les gusta usar la misma contraseña para todo, incluso para sus operaciones bancarias, por lo que una filtración de este tipo para ellos, puede ser muy malo, porque pueden perder acceso a todas sus cuentas de redes sociales, y más en cuestión de horas. Si quieres saber si tu contraseña también está comprometida, puedes ir a este sitio: https://haveibeenpwned.com/, seguro que si tienes una cuenta en twitter te sorprenderás.

Esta es la tendencia de estos últimos años, hay bastantes violaciones de seguridad y filtrado de contraseñas de texto sin formato.

Si te gusta el mundo del pentesting, es posible que conozcas el diccionario más famoso llamado “rockyou.txt” que viene en cualquier distribución de Kali Linux. Es un diccionario que está compuesto por una lista de palabras con contraseñas. El origen de este archivo viene de una empresa que hizo widgets para MySpace. Almacenaron sus contraseñas en texto sin formato y la empresa tuvo una violación de seguridad, un ataque. Por lo que el archivo txt contiene más de 14 millones de contraseñas (aunque es poco probable que algunas hayan sido contraseñas de usuario. Si las pones por orden de longitud verás a los que me refiero).

Otro caso en el que Adobe tuvo una violación de datos notable, pero fue ligeramente diferente. Las contraseñas estaban cifradas, en lugar de texto claro y el cifrado que se utilizó no era seguro. Esto significaba que las contraseñas se podían recuperarse con relativa rapidez. Si desea leer más sobre esta filtración, mira la siguiente publicación de Sophos es este enlace:

https://nakedsecurity.sophos.com/2013/11/04/anatomy-of-a-password-disaster-adobes-giant-sized-cryptographic -torpeza/

Otro caso que de alguna forma, nos afectó a todos, es la de Linkedin, también tuvo una violación de datos. Linkedin usó SHA1 como verificación de contraseñas, que es bastante rápido de calcular usando GPU. 

Aquí es donde entra en juego el hashing. ¿Qué sucede si, en lugar de almacenar la contraseña, solo almacena el hash de la contraseña? Esto significa que nunca tendrá que almacenar la contraseña del usuario, y si su base de datos se filtró, un atacante tendría que descifrar cada contraseña para averiguar cuál era. Eso suena bastante útil.

Solo hay un problema con esto. ¿Qué pasa si dos usuarios tienen la misma contraseña? Como una función hash siempre convertirá la misma entrada en la misma salida, almacenará el mismo hash de contraseña para cada usuario. Eso significa que, si alguien descifra ese hash, ingresa en más de una cuenta. También significa que alguien puede crear una “rainbow” para romper los hashes.

Una tabla arcoíris o “rainbow” en inglés, es una tabla de búsqueda de hashes a textos, por lo que puede averiguar rápidamente qué contraseña tenía un usuario a partir del hash. Una tabla de arcoíris intercambia el tiempo necesario para descifrar un hash por espacio en el disco duro, pero se necesita tiempo para crearla.
Aquí hay un ejemplo rápido para que pueda tratar de entender cómo son.

HashClave
02c75fb22c75b23dc963c7eb91a062cczxcvbnm
b0baee9d279d34fa1dfd71aadb908c3f11111
c44a471bd78cc6c2fea32b9fe028d30aasdfghjkl
d0199f51d2728db6011945145a1b607abasketball
dcddb75469b4b4875094e14561e573d8000000
e10adc3949ba59abbe56e057f20f883e123456
e19d5cd5af0378da05f63f891c7467afabcd1234
e99a18c428cb38d5f260853678922e03abc123
fcea920f7412b5da7be0cf42b8c937591234567

Los sitios web como Crackstation utilizan internamente enromes tablas de arco iris para proporcionar un descifrado rápido de contraseñas para hashes sin “salt”. Hacer una búsqueda en una lista ordenada de hash es bastante rápido, mucho más rápido que intentar descifrar el hash.

Protección contra las tablas del arco iris

Para protegernos contra las tablas de arcoíris, agregamos lo que se le llama comúnmente, “granitos de sal”, salt en inglés, a las contraseñas. La salt se genera aleatoriamente y se almacena en la base de datos, única para cada usuario. En teoría, podría usar la misma salt para todos los usuarios, pero eso significa que las contraseñas duplicadas aún tendrían el mismo hash, y aún se podría crear una tabla de arco iris con contraseñas específicas con esa salt.

La salt se agrega al inicio o al final de la contraseña antes de que se convierta en hash, y esto significa que cada usuario tendrá un hash de contraseña diferente incluso si tienen la misma contraseña. Las funciones hash como bcrypt y sha512crypt manejan esto automáticamente. Ya que las salt no necesitan mantenerse en privado.

Los hashes en los sistemas operativos

Los hashes de contraseña de estilo Unix son muy fáciles de reconocer, ya que tienen un prefijo. El prefijo le indica el algoritmo hash utilizado para generar el hash. El formato estándar es $format$rounds$salt$hash.

Las contraseñas de Windows se codifican mediante NTLM, que es una variante de md4. Son visualmente idénticos a los hashes md4 y md5, por lo que es muy importante usar el contexto para calcular el tipo de hash.

En Linux, los hash de contraseña se almacenan en /etc/shadow. Este archivo normalmente solo es legible por root. Solían almacenarse en /etc/passwd y todos podían leerlos. Por tal motivo se separaron estos archivos en dos partes el /etc/shadow y el /etc/passwd.

Aspecto de una contraseña cifrada en GNU/Linux

ramon:$1$on5bv0Gu$qWLrJ7Fp8Y/Umazwe8Ifo/:14718:0:99999:7:::
  • $1$ – MD5
  • $2a$ – Blowfish
  • $2y$ – Eksblowfish
  • $5$ – SHA-256
  • $6$ – SHA-512

 Por lo que podemos hacer la siguiente tabla:

PrefijoAlgoritmo
$1$md5crypt, utilizado en cosas de Cisco y sistemas Linux/Unix más antiguos
$2$, $2a$, $2b$, $2x$, $2y$Bcrypt (Popular para aplicaciones web)
$6$sha512crypt (predeterminado para la mayoría de los sistemas Linux/Unix)

En Windows, los hashes de contraseña se almacenan en la SAM. Windows intenta evitar que los usuarios normales los descarguen, pero existen herramientas como mimikatz para poder hacerlo, o pwdump. Es importante destacar que los hashes que se encuentran allí se dividen en hashes NT y hashes LM.

Un gran lugar para encontrar más formatos de hash y prefijos de contraseña es la página de ejemplo de Hashcat, disponible aquí.

Para otros tipos de hash, normalmente tendrá que ir por longitud, codificación o alguna investigación sobre la aplicación que los generó. Nunca subestimes el poder de la investigación.

Comprobando la integridad

El hash se puede utilizar para comprobar que los archivos no se han modificado. Si ingresas los mismos datos, siempre obtendrás los mismos datos. Si cambia incluso un solo bit, el hash cambiará mucho. Esto significa que puede usarlo para verificar que los archivos no hayan sido modificados o para asegurarse de que se hayan descargado correctamente. También puede usar hash para encontrar archivos duplicados, si dos imágenes tienen el mismo hash, entonces son la misma imagen.

HMAC

HMAC es un método de uso de una función hash criptográfica para verificar la autenticidad e integridad de los datos. Por ejemplo hay VPN que usan HMAC-SHA512 para la autenticación de mensajes, que puede ver en la salida del terminal. Se puede usar un HMAC para garantizar que la persona que creó el HMAC sea quien dice ser (autenticidad) y que el mensaje no se haya modificado ni dañado (integridad). Utilizan una clave secreta y un algoritmo hash para producir un hash.

Conclusión

Como hemos visto, la criptografía juega un papel fundamental en muchos órdenes de nuestra vida, sobre todo en la protección de contraseñas y la privacidad de la información.

Actualmente es muy importante, quizás hace 20 años el resguardo de datos no era tan fundamental, pero actualmente, sí lo es. Prácticamente, proveedores de servicios como Google Drive, Mega, y en general, cualquier proveedor de almacenamiento en la nube, utiliza la criptografía para resguardar la información de sus clientes.

Es por ello que, la mayoría de estos proveedores utilizan el SSL para resguardar el envío que ocurre entre servidor y usuario; una vez que la información se encuentra en sus bases de datos, estos utilizan diferentes tipos de criptografía, para evitar que terceros puedan acceder a ella. Asimismo, estas plataformas en cuestión poseen cifrado en su codificación, para evitar que agentes externos puedan tener acceso a enlaces o líneas de código delicadas.

Incluso, los discos duros y memorias externas poseen tecnología de cifrado, pero esta sólo ocurre cuando se resguarda una carpeta con contraseña en la base de datos del disco o en la memoria; de esta forma, en lugar de guardarse la contraseña como fue escrita, esta se cifra mediante hash, para evitar que algún programa externo la pueda obtener.

No hay actividad que se realice el día de hoy que no use la criptografía. Por lo que convierte esta ciencia en algo fundamental para proteger la seguridad de la información.