¿Qué es el hash? ¿Cómo se usa en el cifrado de seguridad?

Una función hash es una función que toma datos arbitrarios como entrada y devuelve una salida en un dominio conocido. La salida para una entrada dada siempre es fija.

Para que un hash se considere una buena función hash criptográfica, debe satisfacer las siguientes propiedades (de Wikipedia):

  • Es fácil calcular el valor hash para cualquier mensaje dado
  • No es factible generar un mensaje que tenga un hash dado
  • No es factible modificar un mensaje sin cambiar el hash
  • No es factible encontrar dos mensajes diferentes con el mismo hash.

Entonces, básicamente, si tiene una cadena aleatoria, diga “QuickBrownFox”, digamos que nuestra función hash devuelve un valor hash de 8 bytes,

h (“QuickBrownFox”) = “njdaw13f”

Esta función de hash realiza esta conversión de una entrada de longitud arbitraria a una cadena de 8 bytes, con las propiedades de que esta cadena es lo suficientemente aleatoria (es decir, la probabilidad de encontrar otra cadena con el mismo valor de hash es baja, y es computacionalmente poco práctico obtenerla). la cadena del valor hash.

Dichas funciones encuentran usos prácticos en muchas aplicaciones:

1. Almacenar contraseñas

Muchos sitios web necesitan almacenar nombres de usuario y contraseñas. El almacenamiento de contraseñas en texto sin formato (es decir, tal cual) conlleva un gran riesgo de seguridad. Si alguien con una intención maliciosa obtiene una copia de la base de datos, puede ver su contraseña al instante y explotarla para sus fines (la mayoría de las personas usan las mismas contraseñas para varias cuentas, por lo que el riesgo de seguridad se amplifica).

El riesgo se reduce considerablemente mediante el uso de hashes. Entonces, si su contraseña es “QuickBrownFox”, no guardaré esta cadena exacta en mi base de datos, la pondré a través de una función hash y almacenaré el valor hash “njdaw13f” en mi base de datos.

La próxima vez que vengas, te pediré una contraseña. Lo que escriba, lo pasaré por mi función hash, y solo si coincide con el valor hash almacenado (“njdaw13f”), le permitiré pasar.

Por lo tanto, incluso si el atacante conoce el valor hash al piratear la base de datos, la contraseña sigue siendo segura (a menos que sea una cadena pequeña y simple a la que se pueda aplicar fuerza bruta, o a menos que haya una cadena pequeña y simple con el mismo hash que mi cadena compleja). Aquí, confiamos en las propiedades antes mencionadas de las funciones hash criptográficas.

2. Comprobación de la integridad del archivo

Imagine que está escribiendo una aplicación de transferencia de archivos. Desea saber si el servidor transfirió correctamente el archivo al cliente, sin ningún tipo de corrupción. Una opción es enviar el archivo nuevamente y hacer coincidir ambas versiones; si son iguales, la transferencia estuvo bien. Si no, uno de ellos estaba dañado.

Con archivos grandes, esto desperdicia una gran cantidad de ancho de banda y es muy ineficiente. Existe una alternativa mucho más elegante.

Servidor: Hola cliente, acabo de terminar de transferir el archivo. ¿Me puede decir el hash del archivo que recibió?

Cliente: Sí, es “0gj32bj”.

Servidor: Sí, mi versión del archivo tiene el mismo hash. Aparentemente, la descarga se completó sin ningún inconveniente. ¡Aclamaciones!

En lugar de transferir todo el archivo (que podría ejecutarse en GB), simplemente transfiere una cadena de 8 bytes (las funciones hash utilizadas prácticamente tienen un espacio clave mucho mayor, como 512 bytes o 1024 bytes, ya que la probabilidad de una colisión con 8 -byte keypace es muy grande). Como sabemos que es muy improbable que dos archivos diferentes tengan la misma función hash, podemos decir con mucha seguridad que si los hashes de dos archivos son iguales, los archivos mismos son iguales.

3. Mantener sincronizadas dos réplicas de un objeto

Esto es muy similar a la aplicación 2. Imagine que tiene dos servidores que alojan el mismo contenido para distribuir la carga (digamos que uno sirve a los EE. UU. Y el otro a Asia, por lo que el ancho de banda es costoso). Si se modifican los datos en un servidor, el cambio debe replicarse en el otro servidor. Existen algoritmos eficientes para esto. Digamos que solo queremos saber si se actualizaron los datos del servidor de EE. UU., Para que podamos iniciar algún proceso de importación de los cambios en nuestro servidor de Asia.

Servidor de EE. UU .: Hola, servidor de Asia: aquí hay un resumen de mis datos actuales: “podmcme”

Servidor de Asia: Hola, servidor de EE. UU., El hash de mis datos es diferente. Parece que necesitamos volver a sincronizar.

O

Servidor de EE. UU .: Hola, servidor de Asia: aquí hay un resumen de mis datos actuales: “podmcme.

Servidor de Asia: Hola, servidor de EE. UU .: el valor hash de mis datos es el mismo. Parece que no necesitamos volver a sincronizar.

¡Solo unos pocos bytes de transferencia de datos!

4. Firmas digitales

Esto requeriría también el conocimiento de la criptografía de clave pública. Así que solo daré una analogía simple.

Digamos, JK Rowling lanzó una nueva copia de Harry Potter. Ahora, las personas paranoicas piensan que es solo fan fiction y no una copia genuina. Pero los fanáticos reconocen la firma de JK Rowling, y por un poco de magia matemática, la firma es imposible de duplicar.

Una forma en que ella podría confirmar su autenticidad sería firmar cada página del libro (un ejercicio agotador) o podría calcular el hash del libro y adjuntar un recibo que contenga el hash pequeño, y su firma en la hoja que contiene el hash. Ahora, la gente sabe que los hashes son imposibles de falsificar, y las firmas digitales también son imposibles de falsificar, por lo que el libro debe ser genuino.