Sal (criptografía)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 15 de octubre de 2019; las comprobaciones requieren 17 ediciones .

Salt (también un modificador de entrada de función hash ) es una cadena de datos que se pasa a la función hash junto con la matriz de datos de entrada ( preimagen ) para calcular el hash ( imagen ).

Se utiliza para dificultar la determinación de la preimagen de una función hash mediante la iteración a través de un diccionario de posibles valores de entrada (preimágenes), incluidos los ataques que utilizan tablas de arco iris . Le permite ocultar el hecho de usar los mismos prototipos cuando usa diferentes sales para ellos. Hay sal estática (la misma para todos los valores de entrada) y sal dinámica (generada para cada valor de entrada individualmente).

Ejemplo de uso

Deje que las contraseñas se conviertan en hash utilizando el algoritmo MD5 y se almacenen como valores hash en la base de datos . En caso de robo de una base de datos, las contraseñas originales se pueden recuperar utilizando tablas de arco iris preparadas previamente , ya que los usuarios a menudo usan contraseñas poco confiables que se seleccionan fácilmente de los diccionarios [1] . Si la contraseña es "salada", es decir, al calcular los valores hash, agregue a los datos de entrada una cadena de varios caracteres aleatorios que serán el valor salt, entonces los valores resultantes no coincidirán con los diccionarios comunes de valores hash. Conocer la sal le permite generar nuevos diccionarios para iterar, por lo que el valor de la sal debe mantenerse en secreto. Para salt, se aplican las mismas recomendaciones para la complejidad que para la complejidad de la contraseña, es decir, el valor de salt debe tener una buena entropía y longitud [2] .

Un ejemplo de cómo crear un hash usando una sal estática en PHP basado en el principio de concatenación (conexión) con los datos de entrada:

$contraseña1 = '12345' ; $contraseña2 = '67890' ; $sal = 'sflpr9fhi2' ; // Salt $contraseña1_saltedHash = md5 ( $contraseña1 . $salt ); // Concatenar la cadena de entrada con la sal y pasarla a través de la función hash md5() $password2_saltedHash = md5 ( $password2 . $salt );

En este ejemplo, la sal es una cadena determinista , lo que significa que el valor de la sal es constante en todas las entradas.

Sal dinámica

Existen esquemas dinámicos de formación de sal, en los que se generan valores de sal para cada valor de entrada de forma individual, lo que dificulta la compilación de diccionarios de fuerza bruta, y además oculta el hecho de almacenar las mismas contraseñas utilizadas por diferentes usuarios. Además, la eficiencia del esquema aumenta si se usa una mezcla no trivial de acuerdo con algún algoritmo. Por ejemplo, la sal no solo se puede agregar al final de la contraseña, sino que también se puede "mezclar" en ciertos intervalos de la contraseña. Además, el hash se puede calcular cíclicamente, mezclando la sal en partes con algunos cambios [3] , dependiendo del número de iteraciones del hash .

Uno de los estándares más conocidos, PBKDF2 , describe la mezcla de sal en varias iteraciones.

Un ejemplo de almacenamiento de las mismas contraseñas de diferentes usuarios, sujeto a un salt (dinámico) generado personalmente
Nombre de usuario clave md5 (contraseña) sal contraseña+sal md5 (contraseña+sal)
usuario1 qwerty123 3fc0a7acf087f549ac2b266baf94b8b1 5hr8Uh32Hr qwerty1235hr8Uh32Hr 1dfa98fc519fc0022e86014445d8b158
usuario2 qwerty123 3fc0a7acf087f549ac2b266baf94b8b1 Ju5yFy35Jk qwerty123Ju5yFy35Jk 269777fd3b1c37ef1cfc1e238213324f

La tabla anterior muestra que las mismas contraseñas de usuario con diferentes sales dinámicas eventualmente darán diferentes valores hash.

Problemas con la sal y la seguridad de la contraseña

Con acceso no autorizado a la base de datos del sistema de autorización, un atacante puede obtener la información necesaria para pasar la autorización en nombre de los usuarios de esta base de datos. Si las contraseñas se almacenan en su forma original (clara), un atacante puede usarlas para acceder a otros recursos, ya que los usuarios suelen usar las mismas contraseñas para diferentes servicios web [4] . El uso de una sal dinámica le permite evitar comprometer las cuentas de usuario en varios servicios web a la vez.

Con un sistema mal pensado para usar sal, sus ventajas se pierden:

Pequeña longitud de sal y baja entropía.

Si el salt es corto, será fácil para un atacante crear una tabla de arcoíris que consista en todos los salts posibles de cierta longitud, agregados a cada contraseña posible. Además, el uso de una sal con baja entropía aumentará la posibilidad de encontrar con éxito la sal en el diccionario, por lo que el valor de la sal idealmente debería generarse utilizando un RNG [5] . El uso de una sal larga con buena entropía garantiza que la tabla arcoíris para la base de datos sea demasiado grande y requiera recursos significativos del atacante para generarla y almacenarla [6] .

Reutilización de sal para diferentes prototipos

Aunque el uso de una sal estática para las mismas preimágenes hará que algunas tablas de arcoíris existentes sean inútiles, debe tenerse en cuenta que si la sal se escribe estáticamente en el código fuente de un producto popular, tarde o temprano se puede extraer, después de lo cual se crea una nueva. La mesa del arco iris se puede crear a partir de esta sal. Si la sal se genera dinámicamente para cada preimagen individualmente, usando algunos parámetros únicos para cada usuario, entonces la estabilidad del sistema aumenta.

El uso de una sal fija también significa que cada usuario que ingrese la misma contraseña tendrá el mismo hash. Esto hace que sea más fácil atacar a varios usuarios descifrando solo uno de los hashes repetidos [7] .

Beneficios del uso de sal en los sistemas de autorización

Para comprender la diferencia entre descifrar una sola contraseña y escribirla, considere un archivo de contraseñas que contenga cientos de nombres de usuario y contraseñas cifradas. Sin un salt, un atacante puede calcular un hash de algún valor (por ejemplo, de un diccionario) y luego verificar si ese hash ocurre en alguna parte del archivo. La probabilidad de una coincidencia, es decir, de descifrar una de las contraseñas, obviamente aumenta con la cantidad de contraseñas en el archivo. Si se usa un salt, y además es dinámico, es decir, tiene al menos varios valores posibles para un hash, entonces el atacante debe calcular el hash para cada posible par de salt y la contraseña buscada, lo que dramáticamente aumenta la complejidad de la búsqueda.

La sal también le permite contrarrestar el uso de tablas hash para descifrar contraseñas. En el caso de las contraseñas de los usuarios, una tabla hash es una colección de hashes calculados previamente para contraseñas de uso frecuente. Para un archivo de contraseña sin sal, un atacante podría recorrer cada entrada y encontrar la contraseña hash correspondiente en la tabla hash. Dado que la búsqueda es mucho más rápida que el cálculo de hash, esto acelerará en gran medida el proceso de descifrado de contraseñas. Pero si el archivo de contraseñas se forma con una sal, entonces la tabla hash debe contener valores previamente cifrados con la sal. Si la sal es lo suficientemente larga y tiene una entropía alta (es aleatoria), entonces la probabilidad de romperse se reduce drásticamente. Las contraseñas sin sal elegidas por humanos generalmente son vulnerables a los ataques de diccionario porque generalmente se eligen para que sean lo suficientemente cortas y fáciles de recordar. Incluso un pequeño diccionario (o su equivalente hash, una tabla hash) es de gran ayuda para descifrar las contraseñas más utilizadas.

Desde un punto de vista técnico, salt protege contra las tablas hash y las tablas arcoíris porque esencialmente extiende la longitud y potencialmente la complejidad de la contraseña . Si no hay contraseñas en las tablas del arco iris que coincidan con la longitud (por ejemplo, una contraseña de 8 bytes y una sal de 12 bytes, que es esencialmente una contraseña de 20 bytes) y la complejidad (la sal compleja con alta entropía aumenta la complejidad de las contraseñas alfanuméricas seguras simples) del saltado contraseña, no se encontrará la contraseña.

El moderno sistema de contraseñas en la sombra , en el que los hash de contraseñas y otros datos de seguridad se almacenan en un archivo no público, resuelve en parte el problema del acceso no autorizado al archivo hash. Al mismo tiempo, siguen siendo relevantes en instalaciones de varios servidores que utilizan sistemas centralizados de gestión de contraseñas para transferir contraseñas o hash de contraseñas a varios sistemas [8] .

Salt también hace que los ataques de diccionario y los ataques de fuerza bruta para descifrar una gran cantidad de contraseñas sean extremadamente lentos (pero no en el caso de descifrar una sola contraseña). Sin sal, un atacante que descifra un gran conjunto de contraseñas se ve obligado a comparar cada vez con todos los candidatos. Dado que la sal puede ser dinámica, se debe intentar aplicar cada opción de sal a cada contraseña de la lista.

Otro beneficio de salt es que dos usuarios pueden elegir la misma cadena como su contraseña, o el mismo usuario puede usar la misma contraseña en dos computadoras. Sin la sal, esta contraseña se almacenará como la misma cadena hash en el archivo de contraseñas. Esto revelaría el hecho de que las dos cuentas tienen la misma contraseña, lo que permitiría que cualquiera que conozca la contraseña de una de las cuentas pueda acceder a la otra cuenta. Cuando se mezcla salt, incluso si dos cuentas usan la misma contraseña, nadie puede detectarla simplemente mirando los valores hash.

Salt en sistemas UNIX

La mayoría de los sistemas UNIX utilizan la biblioteca del sistema crypt(3) como una función unidireccional . Inicialmente, esta biblioteca usaba una función hash basada en el algoritmo DES . En este caso, la contraseña se limitó a 8 caracteres (7 bits por carácter, es decir, 56 bits), y se utilizó un salt de 12 bits [9] .

En 1994, Poul-Henning Kamp creó un nuevo algoritmo de hashing de contraseñas basado en MD5 que permitía contraseñas de cualquier longitud y usaba mil iteraciones de MD5 [10] [11] . El resultado de la función fue una cadena que contenía la etiqueta del algoritmo hash (versión), salt y hash.

En ese momento, la demora para calcular dicho hash fue suficiente para resistir de manera efectiva la adivinación de contraseñas por fuerza bruta. Sin embargo, a medida que ha crecido la potencia informática, el tiempo para encontrar MD5 se ha reducido drásticamente. Esto ha llevado a la aparición de algoritmos computacionalmente más complejos en cripta y control sobre el número de iteraciones [12] .

La biblioteca ahora admite varias funciones hash basadas en algoritmos: MD5 , SHA-256 , SHA-512 , Blowfish (en algunas distribuciones de Linux , OpenBSD y algunos otros sistemas similares a UNIX) [13] . El resultado de la función es una cadena que contiene la etiqueta del algoritmo hash, salt, hash y otros datos (por ejemplo, el número de rondas de la función hash).

En 2012, Poul-Henning Kamp pidió el abandono total del algoritmo md5crypt que creó, ya que no proporciona un aumento tangible en el tiempo de cálculo de hash en las condiciones modernas y, por lo tanto, no protege contra la enumeración exhaustiva [14] .

Véase también

Notas

  1. Un estudio sobre contraseñas . Security-Corp.org: un recurso dedicado a cuestiones de seguridad de la información. Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  2. Qué contraseña protegerá contra la piratería o la entropía al servicio del secreto . samag.ru. Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  3. Hashing de contraseña "salado": hacerlo bien . Tecnologías de Internet.ru. Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  4. Club.CNews.ru: 52% de los usuarios usan las mismas contraseñas en diferentes sitios . Club.CNews.ru. Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  5. Generadores de números aleatorios en criptografía . studopedia.net. Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  6. Velocidad de fuerza bruta de contraseña en CPU y GPU . bozza.ru Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  7. Millones de usuarios de Microsoft usan contraseñas repetitivas . i2HARD. Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  8. Almacenamiento distribuido de hashes de contraseña - "Hacker" . Consultado el 14 de diciembre de 2019. Archivado desde el original el 14 de diciembre de 2019.
  9. Proyecto OpenNet: Llamadas de biblioteca MAN crypt(3) (FreeBSD y Linux) . Consultado el 24 de junio de 2012. Archivado desde el original el 26 de junio de 2012.
  10. Registro CVS de FreeBSD para src/lib/libcrypt/crypt.c . Consultado el 9 de julio de 2012. Archivado desde el original el 12 de julio de 2013.
  11. Niels Provos, David Mazières. Un esquema de contraseña adaptable al futuro . Documento - Conferencia técnica anual USENIX de 1999, 6 al 11 de junio de 1999, Monterey, California, EE. UU . (junio de 1999). Consultado el 9 de julio de 2012. Archivado desde el original el 9 de agosto de 2012.
  12. Cripta Unix con SHA-256/512 . Consultado el 24 de junio de 2012. Archivado desde el original el 16 de julio de 2013.
  13. crypt(3) - Página del manual de Linux . Consultado el 24 de junio de 2012. Archivado desde el original el 2 de mayo de 2012.
  14. El codificador de contraseñas Md5crypt ya no se considera seguro por el autor (enlace descendente) . Consultado el 9 de julio de 2012. Archivado desde el original el 17 de marzo de 2018. 

Literatura