Conoce Atico34 - Solicita presupuesto
Ciberseguridad

¿Qué es y para qué sirve un Hash?

Un concepto que encontrarás una y otra vez en cualquier discusión sobre ciberseguridad es el concepto de hash. Estas largas cadenas de números y letras aparentemente aleatorios se generan y utilizan de varias formas importantes. Algunas soluciones antivirus se basan en ellos casi exclusivamente para fines de detección, pero aunque es una forma bastante limitada y fácil de derrotar para detectar malware moderno, los hash tienen un gran valor para establecer la identidad y se utilizan de muchas formas diferentes. En esta publicación, veremos algunos de ellos mientras exploramos qué es un hash y cómo funciona.

¿Qué es un hash?

Los hash son la salida de un algoritmo de hash como MD5 (Message Digest 5) o SHA (algoritmo de hash seguro). Básicamente, estos algoritmos tienen como objetivo producir una cadena única de longitud fija, el valor hash o “resumen del mensaje”, para cualquier dato o “mensaje” dado.

Como cada archivo en una computadora son, en última instancia, solo datos que se pueden representar en forma binaria, un algoritmo hash puede tomar esos datos y ejecutar un cálculo complejo en ellos y generar una cadena de longitud fija como resultado del cálculo. El resultado es el valor hash del archivo o el resumen del mensaje.

El hash está diseñado para resolver el problema de tener que buscar o almacenar de manera eficiente un artículo en una colección.

Por ejemplo, si tenemos una lista de 10,000 palabras en inglés y queremos verificar si una palabra determinada está en la lista, sería ineficaz comparar sucesivamente la palabra con los 10,000 elementos hasta que encontremos una coincidencia. Incluso si la lista de palabras está ordenada lexicográficamente, como en un diccionario, necesitarás algo de tiempo para encontrar la palabra que estás buscando.

El significado de hash lo considera una técnica para hacer las cosas más eficientes al reducir efectivamente la búsqueda desde el principio.

Hashing significa usar alguna función o algoritmo para mapear datos de objeto a algún valor entero representativo.

Este llamado código hash (o simplemente hash) se puede utilizar como una forma de delimitar nuestra búsqueda al buscar el elemento en el mapa.

Generalmente, estos códigos hash se utilizan para generar un índice, en el que se almacena el valor.

¿Cómo funcionan?

En las tablas hash, almacena datos en forma de pares de clave y valor. La clave, que se utiliza para identificar los datos, se proporciona como entrada a la función hash. El código hash, que es un número entero, se asigna al tamaño fijo que tenemos.

Las tablas hash deben admitir 3 funciones.

  • insertar (clave, valor)
  • obtener (la clave)
  • borrar (clave)

Simplemente como un ejemplo para ayudarnos a comprender el concepto, supongamos que queremos asignar una lista de claves de cadena a valores de cadena (por ejemplo, asignar una lista de países a sus ciudades capitales).

Y supongamos que nuestra función hash es simplemente tomar la longitud de la cadena.

Para simplificar, tendremos dos matrices: una para nuestras claves y otra para los valores.
Entonces, para colocar un elemento en la tabla hash, calculamos su código hash (en este caso, simplemente contamos el número de caracteres), luego colocamos la clave y el valor en las matrices en el índice correspondiente.

Por ejemplo, Cuba tiene un código hash (longitud) de 4. Así que almacenamos Cuba en la 4ª posición en la matriz de claves y La Habana en el 4º índice de la matriz de valores, etc.

Ahora, en este ejemplo específico, las cosas funcionan bastante bien. Nuestra matriz debe ser lo suficientemente grande para acomodar la cuerda más larga, pero en este caso son solo 11 ranuras.
Perdemos un poco de espacio porque, por ejemplo, no hay claves de 1 letra en nuestros datos, ni claves entre 8 y 10 letras.

Pero en este caso, el espacio desperdiciado tampoco es tan malo. Tomar la longitud de una cadena es agradable y rápido, al igual que el proceso de encontrar el valor asociado con una clave determinada.

Pero, ¿qué hacemos si nuestro conjunto de datos tiene una cadena que tiene más de 11 caracteres?

¿Qué pasa si tenemos otra palabra con 5 caracteres, “India”, e intentamos asignarla a un índice usando nuestra función hash? Dado que el índice 5 ya está ocupado, tenemos que hacer una llamada sobre qué hacer con él. A esto se le llama colisión.

Si nuestro conjunto de datos tuviera una cadena con mil caracteres y crearas una matriz de miles de índices para almacenar los datos, resultaría en un desperdicio de espacio. Si nuestras claves fueran palabras aleatorias del inglés, donde hay tantas palabras con la misma longitud, usar la longitud como función hash sería bastante inútil.

¿Para qué sirven los valores hash?

Dado un identificador único para un archivo, podemos usar esta información de varias formas.

Algunas soluciones antivirus se basan completamente en valores hash para determinar si un archivo es malicioso o no, sin examinar el contenido o el comportamiento del archivo. Para ello, mantienen una base de datos interna de valores hash que pertenecen a malware conocido. Al escanear un sistema, el motor AV calcula un valor hash para cada archivo ejecutable en la máquina del usuario y prueba para ver si hay una coincidencia en su base de datos.

Esto debe haber parecido una buena solución en los primeros días de la seguridad cibernética, pero no es difícil ver los fallos en confiar en los valores hash en retrospectiva.

Primero, a medida que la cantidad de muestras de malware se ha disparado, mantener una base de datos de firmas se ha convertido en una tarea que simplemente no escala. Se ha estimado que cada día aparecen más de 500.000 muestras de malware únicas. Es muy probable que esto se deba en gran parte a que los autores de malware se dan cuenta de que pueden engañar a los motores antivirus que dependen de hashes para que no reconozcan una muestra con mucha facilidad. Todo lo que el atacante tiene que hacer es agregar un byte extra al final de un archivo y producirá un hash diferente.

Este es un proceso tan simple que los autores de malware pueden automatizar el proceso de modo que la misma URL entregue el mismo malware a las víctimas con un hash diferente cada pocos segundos.

En segundo lugar, el fallo en el antivirus siempre ha sido que la detección requiere el conocimiento previo de la amenaza, por lo que una solución anti-malware por diseño que se basa en una base de datos de valores hash conocidos siempre está un paso por detrás del próximo ataque.

La respuesta a eso, por supuesto, es una solución de seguridad que aprovecha la inteligencia artificial del comportamiento y que adopta un enfoque de defensa en profundidad.

Sin embargo, eso no significa que los valores hash no tengan valor. Por el contrario, poder identificar un archivo de forma única todavía tiene importantes beneficios. Verás valores hash proporcionados en firmas digitales y certificados en muchos contextos, como firma de código y SSL, para ayudar a establecer que un archivo, sitio web o descarga es genuino.

Los valores hash también son de gran ayuda para los investigadores de seguridad, los equipos de SOC, los cazadores de malware y los ingenieros inversos. Uno de los usos más comunes de los hash que verás en muchos informes técnicos es compartir indicadores de compromiso. Mediante el uso de valores hash, los investigadores pueden hacer referencia a muestras de malware y compartirlas con otros a través de repositorios de malware como VirusTotal, VirusBay, Malpedia y MalShare.

Tipos de funciones hash

Las funciones hash son funciones o técnicas que se utilizan para codificar contraseñas y otro texto sin formato en texto ilegible para almacenar y transmitir. Hay muchos tipos de Hash basadas en la forma en que se codifica el texto sin formato.

Estas funciones pueden ser de dos tipos:

Código de detección de modificaciones

El código de detección de modificaciones (MDC) es una verificación de integridad para los mensajes OpenPGP que ayuda a detectar si los mensajes han sido manipulados. MDC se introdujo en 2001 y está habilitado de forma predeterminada para nuevas claves en GnuPG desde 2003. Sin embargo, las claves antiguas que utilizan algoritmos antiguos no se benefician automáticamente de MDC.

El método de cálculo del Código de detección de modificaciones (MDC) define una función criptográfica unidireccional.

Una función criptográfica unidireccional es una función en la que es fácil calcular la entrada en la salida pero muy difícil calcular la salida en la entrada. MDC usa solo cifrado DES y una clave predeterminada.

Código de autenticación de mensajes

Un código de autenticación de mensajes (MAC) es una suma de comprobación criptográfica de datos que utiliza una clave de sesión para detectar modificaciones tanto accidentales como intencionales de los datos.

Un MAC requiere dos entradas: un mensaje y una clave secreta conocida solo por el originador del mensaje y sus destinatarios previstos. Esto permite al destinatario del mensaje verificar la integridad del mensaje y autenticar que el remitente del mensaje tiene la clave secreta compartida. Si un remitente no conoce la clave secreta, el valor hash sería diferente, lo que le diría al destinatario que el mensaje no es del remitente original.

Hay cuatro tipos de MAC:

  • incondicionalmente seguro,
  • basado en funciones hash,
  • basado en cifrado de flujo y
  • fundamentado en cifrado de bloque

En el pasado, el enfoque más común para crear un MAC era utilizar cifrado de bloque como el Estándar de cifrado de datos (DES), pero Los MAC basados ​​en hash (HMAC) que utilizan una clave secreta junto con una función de hash criptográfica para producir un hash, se han vuelto más utilizados.

Propiedades de las funciones hash

Dado que existen varias hash function o funciones de hash diferentes, es mejor buscar las que tengan las siguientes características.

Bajo coste

El cálculo del valor hash conlleva un coste reducido, tanto de memoria como computacional.

Compresión

Una función hash comprime datos si tiene la opción de mapear un dominio con datos de longitud muy grande a datos con longitud más pequeña.

Uniformidad

Una función hash es uniforme si para una clave escogida de forma aleatoria es igualmente posible tener un valor resumen determinado, con independencia de cualquier otro elemento.

Rango variable

En algunas funciones hash el rango de valores resumen puede ser distinto a lo largo del tiempo.

Por ejemplo, funciones hash utilizadas para tablas resumen que necesitan expandirse. En estos casos es necesario pasar a la función hash un parámetro que le permita conocer en qué rango se mueve la ejecución para calcular el valor resumen.

Inyectividad

Se dice que la función hash es inyectiva cuando cada dato de entrada se mapea a un valor resumen distinto. En este caso, se considera la función hash como perfecta. Para que se dé, es necesario que la cardinalidad del conjunto dominio sea inferior o igual a la cardinalidad del conjunto imagen.

Normalmente, sólo se dan funciones hash perfectas cuando las entradas están preestablecidas. Por ejemplo, mapear los días del año en números del 1 al 366 según el orden de aparición.

Determinismo

Una función hash se considera determinista cuando dada una cadena de entrada siempre devuelve el mismo valor hash. Es decir, el valor hash es el resultado de aplicar un algoritmo que opera solo sobre la cadena de entrada.

Ejemplos de funciones hash no deterministas son aquellas que dependen de parámetros externos, como generadores de números pseudoaleatorios o la fecha. Tampoco son deterministas aquellas funciones hash que dependen de la dirección de memoria en la que está almacenada la cadena de entrada. Esa dirección es accidental y no se considera un cambio de la cadena entrada en sí.

Análisis de resistencia frente a colisiones

Se dice que una función hash tiene resistencia a colisiones cuando es difícil encontrar dos entradas que tengan el mismo valor resumen.

Como encontrar una segunda preimagen no puede ser más fácil que encontrar una colisión, entonces la resistencia a colisiones incluye la propiedad de resistencia a la segunda preimagen.

Normalización de datos

En algunas aplicaciones, las cadenas de entrada pueden contener características que son irrelevantes cuando comparamos las cadenas.

Por ejemplo en algunas aplicaciones las mayúsculas pueden ser irrelevantes. Por tanto para hallar el valor hash es interesante ignorar las distinciones no relevantes entre las cadenas de entrada. De esta forma cadenas distintas con diferencias no relevantes, tienen asociados valores hash iguales.

Continuidad

Una función hash es continua cuando una modificación minúscula en la cadena de entrada ocasiona pequeños cambios en el valor hash.

En una función hash no existe correlación cuando los bits de las cadenas de entrada y los bits de las cadenas de salida no están relacionados, es decir, cuando una pequeña modificación en la cadena de entrada produce cambios en el valor hash comparables a un cambio de cualquier otro tipo.

Aplicaciones de las funciones hash

Dentro de las aplicaciones de las funciones hash, destacamos las siguientes:

Almacenamiento de contraseña

Debido a la propiedad de resistencia previa a la imagen y resistencia a colisiones, las funciones hash son ideales para almacenar las contraseñas. Por lo tanto, los valores que se almacenan en la base de datos son el ID de usuario en su forma original y el valor hash de la contraseña. Cada vez que se introduce el Id y la contraseña en un sistema, busca el Id de usuario, si está disponible, coincide con los valores hash de la contraseña ingresada y la contraseña que ya está en la base de datos. Si ambos son iguales, se concede acceso.

Esto proporciona:

  • Autenticación: Siempre que el usuario ingresa la identificación y la contraseña, la identificación se compara con la que tiene el presente en la base de datos, y la contraseña ingresada se convierte en su valor hash y se compara con la almacenada en la base de datos.
  • Seguridad de alto nivel: la técnica de la función hash proporciona un nivel de seguridad extremo, porque incluso si el pirata informático o atacante tiene éxito en ingresar a la base de datos del sistema, todo lo que obtiene es el ID de usuario y el valor hash de la contraseña.

Comprobación de la integridad de los datos

Para mantener la integridad de los datos, el remitente envía tanto el mensaje como su valor hash al usuario. El receptor luego verifica si el valor hash del mensaje es el mismo que el valor hash enviado por el remitente.

Esto asegura que no se haya realizado ninguna modificación en los datos mientras se transmiten. Este proceso de verificación de integridad se puede ver en sistemas de correo electrónico, aplicaciones de mensajería, etc. Sin embargo, como todo ocurre en el back-end, el usuario no puede identificar este proceso.

Firma digital

Por lo general, se utiliza una firma para vincular al signatario al mensaje. La firma digital es, por tanto, una técnica que vincula a una persona o entidad a los datos digitales.

Esta vinculación asegura que la persona que envía los datos es la única responsable de serlo y esta vinculación puede ser verificada por el receptor y el tercero. Esta firma digital también se almacena mediante funciones hash para que la firma de nadie pueda ser robada o mal utilizada.

Generadores de hash online

Para finalizar, vamos a ver los principales generadores de hash online.

Hash Generator

Hash Generator es la herramienta de generación de hash universal gratuita que automatiza la generación de 14 tipos diferentes de hashes o sumas de comprobación.

Admite la mayoría de los hash populares, incluida la familia MD5, la familia SHA, BASE64, LM , NTLM, CRC32, ROT13, RIPEMD, ALDER32, HAVAL, WHIRLPOOL, etc.

Incluso puede generar hash para el archivo, así como también la entrada de texto. El usuario puede ingresar o pegar directamente cualquier texto del portapapeles y generar hash. También es compatible con la ‘interfaz de arrastrar y soltar’, que te permite arrastrar rápidamente archivos a la herramienta para generar hash.

HashGenerator es una aplicación GUI que viene con una interfaz simple y la hace fácil de usar incluso para principiantes.

60 Tools

Es un generador de hash en línea genera hashes (también llamados sumas de comprobación) con muchos algoritmos de hash. Esta herramienta también permite hash de iteraciones en una ejecución. También puede generar una suma de comprobación de archivo .

Se admiten los siguientes algoritmos hash: md5, sha1, sha256, sha512, ripemd160, ripemd320, whirlpool, tiger192,4, snefru256, gost, gost-crypto, haval256,5.

HashMyFiles

Desarrolladores de software siempre presentes, HashMyFiles de Nirsoft es un útil generador de hash portátil. Aparte de la mayoría de las herramientas, HashMyFiles permite la generación de hash por lotes. Puedes cargar HashMyFiles con una lista de archivos para los que deseas el hash, configurarlo para que funcione y recibir hash para toda la lista.

HashMyFiles mostrará hashes para MD5, SHAxxx y CRC32. Al igual que Hash Generator, puedes agregar una entrada HashMyFiles a tu menú contextual del botón derecho. Sin embargo, HashMyFiles te permite agregar una carpeta completa para hash a través del menú contextual, en lugar de la opción de archivo único de Hash Generator.

HashTab

HashTab es una versión diferente de la generación de hash de archivos. En lugar de usar una interfaz separada para generar los hashes de tus archivos, HashTab agrega una pestaña a su menú Propiedades. Luego, en lugar de arrastrar y soltar un archivo en el programa, haz clic con el botón derecho en el archivo, selecciona Propiedades y abre la pestaña File Hashes.

HashTab genera hashes para MD5, CRC32 y SHA1 de forma predeterminada. Las opciones HashTab te permiten agregar hash para más de 25 hash adicionales, incluida la familia SHA, RIPEMD, TIGER y WHIRLPOOL.

Puedes agregar más hashes a la pestaña File Hashes abriendo el menú Propiedades, seleccionando la pestaña File Hashes y seleccionando Configuración. Marca los hashes que deseas agregar y presiona OK.

Otra buena característica de HashTab es el comprobador de archivos integrado. Puedes realizar una referencia cruzada de cualquier archivo desde la pestaña Hash de archivo utilizando la opción de menú Comparar un archivo.

QuickHash

QuickHash es un generador de hash de código abierto para Windows, macOS y Linux. También es una de las opciones de verificación y generación de hash con más funciones en esta lista.

Aunque la cantidad de hashes que puede usar es pequeña, solo MD5, SHA1, SHA256, SHA512 y xxHash64, Quick Hash tiene un montón de funciones adicionales.

QuickHash puede aplicar hash a una carpeta completa, comparar dos archivos individuales, comparar directorios completos o un disco completo. Por supuesto, este último toma una cantidad considerable de tiempo debido al tamaño, pero la opción es agradable de ver. También puede trabajar en un documento de texto línea por línea, aplicando el hash de cada uno a medida que avanza.

MultiHasher

MultiHasher presenta a los usuarios una amplia gama de herramientas de verificación y generación de hash en un solo paquete. Como muchos de los mejores programas de verificación y generación de hash, MultiHasher tiene varias opciones de hash. Puede arrastrar y soltar un solo archivo o una carpeta completa para hacer hash o generar un hash para una cadena de texto.

MultiHasher genera hashes en MD5, SHA1, SHA256, SHA384, SHA512 o RIPEMD-160.

MultiHasher también tiene una característica que no he visto en ningún otro generador y verificador de hash de archivos: integra la base de datos de verificación de archivos maliciosos de VirusTotal. Puede verificar que el hash del archivo descargado coincida con la fuente de descarga, así como informar a VirusTotal de cualquier cosa adversa o maliciosa al mismo tiempo.