¿Qué es hashing?
Hashing transforma datos de cualquier tamaño en una cadena alfanumérica de longitud fija y predeterminada. Una función hash es irreversible: no es posible determinar los datos de entrada originales basándose en el resultado de la función hash. Esto hace que hashing sea ideal para el almacenamiento seguro de datos. Hashing puede convertir cualquier tipo o volumen de datos, como el título de un libro, el texto completo de un libro o el archivo de ilustración para la portada. Cada uno de estos elementos de datos se puede hash a cadenas de la misma longitud fija. Una función hash puede tener como objetivo maximizar la probabilidad de unicidad de los datos transformados.
Los datos de entrada a menudo se llaman la “clave”, mientras que una función hash es el conjunto de pasos (el algoritmo) realizados en la clave. Los resultados de la función hash se llaman por varios nombres diferentes: valores hash, códigos hash o simplemente hashes. Para los propósitos de este artículo, utilizaremos los términos datos de entrada, función hash y valor hash. Los valores hash se utilizan para diferentes propósitos, incluyendo la gestión eficiente de la base de datos, la integridad de los datos y la seguridad.
¿Para qué se usa hashing?
Almacenamiento y recuperación de datos
Uno de los primeros usos de hashing fue para sistemas eficientes de almacenamiento y recuperación de datos. Un conjunto de datos grande puede tardar mucho tiempo en buscarse. Realizar una búsqueda en el valor hash de un término de búsqueda en lugar del término de entrada acorta los tiempos de respuesta y, por lo tanto, mejora la experiencia del usuario. Tomemos el ejemplo de una base de datos de libros en una biblioteca que divide todas las entradas en grupos más pequeños basados en el valor hash de los títulos. Cuando un usuario busca el título de un libro, el valor hash del título solicitado señalará rápidamente al grupo correcto. Entonces, se realiza una búsqueda rápida del título exacto original dentro del grupo más pequeño. En otras palabras, el tiempo que lleva ejecutar la función hash e identificar el subconjunto de datos correcto, sumado al tiempo requerido para encontrar el título en el subconjunto correcto, es aún menor que el tiempo necesario para encontrar el título del libro en el conjunto de datos completo.
Seguridad de la contraseña
Almacenar el valor hash de una contraseña es más seguro que almacenar la contraseña real. Debido a que no se almacena ninguna contraseña real (encriptada o desencriptada), la cuenta del individuo es mucho más segura en caso de una violación de datos.
Integridad de los datos
Comparar dos archivos usando sus valores hash puede determinar si los archivos son idénticos. Ejecutar una función hash en dos documentos es más rápido que comparar cada documento carácter por carácter. Si se supone que dos archivos son iguales pero son diferentes, los valores hash diferentes indicarán que uno de los archivos fue alterado. Esta prueba puede indicar cambios y actualizaciones en los archivos, o puede exponer si un archivo ha sido corrompido por Malware.
La comparación de valores hash de documentos ocurre en lugares como la autentificación de mensajes y la blockchain. La autentificación de mensajes, a veces acompañada de firmas digitales, utiliza tanto hashing como encriptación. En esta situación, la encriptación se utiliza para proteger el contenido del mensaje durante la transmisión y hashing se usa para verificar que el contenido no fue manipulado durante el tránsito.
Blockchain usa hashing para verificar de manera independiente que los datos en el blockchain no han sido alterados. Un blockchain se construye sobre capas de datos de transacciones y valores hash asociados, con los valores hash actuando como una confirmación de que los datos precedentes en la cadena no han sido alterados.
¿Cómo funciona hashing?
Una función hash utiliza una variedad de operaciones. Pueden ser aritméticas, involucrar conversiones o transformaciones, o ser procedimientos que manipulan los bits reales (unidades básicas de datos informáticos) del archivo de entrada. Aunque los datos de entrada pueden ser de cualquier tamaño, una función hash dada siempre devolverá un valor hash del mismo tamaño, a menudo de 32 a 64 caracteres, dependiendo del conjunto de caracteres utilizados. Idealmente, la función hash se ejecuta rápidamente y da como resultado una distribución uniforme de todos los valores hash posibles.
Con datos de entrada grandes (como nuestro ejemplo de hash de un documento completo), podría tomar varias pasadas a través de la función hash para llegar a un valor hash final que represente todos los datos de entrada. La función hash se ejecuta primero en un pequeño bloque de los datos de entrada. Este valor hash preliminar resultante se combina luego con otro pequeño bloque de los datos de entrada originales y el resultado se ejecuta a través de la función hash. La combinación y ejecución continúan hasta que se procesan todos los datos de entrada originales.
Una función hash necesita ser reproducible y repetible. Si se le dan los mismos datos de entrada, una función hash debe devolver el mismo valor hash cada vez. Estos criterios afectan no solo las operaciones realizadas como parte de la función hash, sino también el orden en que se procesan los datos. Si unos grandes datos de entrada se dividieran en pequeños bloques de manera diferente antes de ser hasheados, los valores hash resultantes serían diferentes. De esta manera, datos de entrada muy similares podrían producir valores hash muy diferentes, algo conocido como el Efecto Avalanche.
Una función hash es irreversible: no puedes resolver directamente los datos de entrada originales a partir del valor hash. Esto hace que almacenar un valor hash de una contraseña sea mucho más seguro que una versión encriptada, que puede ser desencriptada por un hacker. Aunque no se puede determinar la contraseña original a partir del valor hash almacenado (porque una función hash es irreversible), el sistema puede confirmar el Inicio de sesión del individuo al hash la contraseña enviada y comparando el resultado con el valor hash almacenado. Una coincidencia indica que la contraseña enviada es la misma que la contraseña que creó el valor hash almacenado.
¿Qué son las colisiones en el hashing?
Una regla de las funciones hash es que todos los valores hash deben tener la misma longitud fija. Esto significa que hay un número máximo de valores hash que puede generar una función hash dada. Tener longitudes fijas más cortas para los valores hash resultará en menos resultados posibles de hashing. Si el número de posibles resultados de valores hash es lo suficientemente grande, puedes esperar con una certeza matemática razonable (pero tal vez no del todo garantizado) que cada dato de entrada se convertirá en un valor hash único.
Una “colisión” ocurre cuando dos diferentes datos de entrada pasan por una función hash y devuelven el mismo valor hash. Algunas aplicaciones del hashing están bien con las colisiones, como en el ejemplo de la base de datos de la biblioteca: en este caso, el hashing se utiliza para dividir una base de datos en grupos más pequeños para mejorar la respuesta del Buscador. El hashing de la base de datos agrupa los datos por colisiones.
Otras aplicaciones, como almacenar versiones seguras de información sensible como contraseñas, necesitan funciones hash diseñadas para minimizar, o incluso eliminar, colisiones. Estas funciones hash tienen resultados de longitud fija más largos, creando así más posibles resultados de valor hash y reduciendo la posibilidad de colisiones. Si la función hash utilizada para hashear valores de contraseñas tuviera solo un pequeño número de resultados posibles, las colisiones serían más probables. Esto significa que habría una mayor posibilidad de que una contraseña incorrecta pudiera generar un valor hash que coincida con el valor hash almacenado.
¿Qué es salting en un hash?
Salting en un hash se refiere a agregar datos adicionales (llamados “sal”) a los datos de entrada reales antes de ejecutar la función hash. Hay muchas maneras de saltear datos de entrada: un ejemplo es poner una cadena de caracteres aleatorios al principio de los datos de entrada reales. El salting reduce las colisiones que resultan de datos idénticos que se originan en diferentes fuentes. A cada fuente de datos se le asigna su propia sal única que puede usarse cada vez que sus datos de entrada pasen por la función hash.
Cualquier dato puede recibir sal, pero el uso más común es agregar sal a una contraseña para añadir una capa extra de complejidad y seguridad. Si dos personas tienen la misma contraseña (por ejemplo, JSmith123), sin agregar sal, tendrán el mismo valor hash. Si un hacker descifra una de estas cuentas, sabrán automáticamente que todos los demás en la base de datos con el mismo valor hash también tienen la contraseña de JSmith123. Pero agregar sal a cada JSmith123 con una sal única garantiza que cada valor hash será único, y una contraseña descifrada no llevará a múltiples contraseñas descifradas.
¿Es el hashing lo mismo que la encriptación?
El hashing y la encriptación pueden parecer similares: ambos convierten datos en un estado ilegible y protegen los datos de ser utilizados de una manera en que no deben ser utilizados. Sin embargo, son procesos diferentes que se utilizan para diferentes situaciones. La diferencia clave entre el hashing y la encriptación es que el hashing es irreversible, mientras que la encriptación debe ser reversible.
La encriptación a menudo se usa para transmitir y almacenar datos de forma segura que finalmente se leerán y utilizarán nuevamente. A esto se le suele llamar mantener la “confidencialidad” de los datos. Los lugares comunes para encontrar datos encriptados incluyen la transmisión de correos electrónicos y los datos sensibles almacenados en bases de datos.
Con el hashing, no hay intención de volver a leer los datos hash. El propósito de un valor hash almacenado es actuar como datos de prueba para comparar con otros valores hash. Cuando esta comparación se hace para asegurarse de que los datos no hayan sido alterados, se le llama mantener la “integridad” de los datos. Un valor hash tiene poco valor por sí mismo: su valor reside en su capacidad para ayudar en el manejo y verificación de datos de manera segura o eficiente.
La autentificación de mensajes y las firmas digitales utilizan tanto hashing como encriptación. El mensaje original se hash. El valor hash y el mensaje original son ambos encriptados y enviados por separado. En el destino, el valor hash encriptado se desencripta y el mensaje recibido se desencripta y se hash. Estos dos valores hash se comparan luego. Si coinciden, se considera que el mensaje no ha sido alterado. Una firma digital también puede verificar la identidad del remitente al requerir y confirmar que el remitente haya usado una clave de encriptación específica para ellos.