En criptografía , un salt es un dato aleatorio que se introduce como entrada adicional a una función unidireccional que aplica un hash a los datos , una contraseña o una frase de contraseña . [ 1 ] El salting ayuda a defenderse de ataques que utilizan tablas precalculadas (por ejemplo, tablas arcoíris ), al aumentar enormemente el tamaño de la tabla necesaria para un ataque exitoso. [ 2 ] [ 3 ] [ 4 ] También ayuda a proteger las contraseñas que aparecen varias veces en una base de datos, ya que se utiliza un nuevo salt para cada instancia de contraseña. [ 5 ] Además, el salting no supone ninguna carga para los usuarios.
Normalmente, se genera aleatoriamente un valor aleatorio (salt) para cada contraseña. El valor aleatorio y la contraseña (o su versión tras el estiramiento de la clave ) se concatenan y se introducen en una función hash criptográfica . El valor hash resultante se almacena junto con el valor aleatorio en una base de datos. No es necesario cifrar el valor aleatorio, ya que conocerlo no ayudaría al atacante. [ 5 ]
El salting se utiliza ampliamente en ciberseguridad, desde credenciales de sistemas Unix hasta seguridad en Internet .
Las sales están relacionadas con los nonces criptográficos .
Ejemplo
Sin un valor aleatorio (salt), las contraseñas idénticas se corresponderán con valores hash idénticos, lo que podría facilitar que un pirata informático adivine las contraseñas a partir de su valor hash.
En cambio, se genera un valor aleatorio (salt) que se añade a cada contraseña, lo que provoca que el hash resultante produzca valores diferentes para la misma contraseña original.
La clave aleatoria (salt) y el hash se almacenan en la base de datos. Para comprobar posteriormente si una contraseña introducida por un usuario es correcta, se puede aplicar el mismo proceso (añadiendo la clave aleatoria del usuario a la contraseña y calculando el hash resultante): si el resultado no coincide con el hash almacenado, es posible que la contraseña introducida no sea la correcta.
En la práctica, una clave aleatoria (salt) se suele generar mediante un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG). Los CSPRNG están diseñados para producir números aleatorios impredecibles, que pueden ser alfanuméricos. Si bien generalmente se desaconseja debido a su menor seguridad, algunos sistemas utilizan marcas de tiempo o contadores simples como fuente de la clave aleatoria. En ocasiones, esta clave se puede generar combinando un valor aleatorio con información adicional, como una marca de tiempo o datos específicos del usuario, para garantizar su unicidad en diferentes sistemas o periodos de tiempo.
Errores comunes
Reutilización de la sal
Usar la misma sal para todas las contraseñas es peligroso porque una tabla precalculada que simplemente tiene en cuenta la sal la volverá inútil. Sin embargo, consulte Pepper .
La generación de tablas precalculadas para bases de datos con valores únicos para cada contraseña no es viable debido al alto costo computacional que esto implica. Sin embargo, si se utiliza un valor común para todas las entradas, la creación de una tabla que contemple dicho valor se convierte en un ataque viable y potencialmente exitoso. [ 6 ]
Dado que la reutilización de la clave aleatoria (salt) puede provocar que los usuarios con la misma contraseña tengan el mismo hash, descifrar un único hash puede comprometer también otras contraseñas.
Longitud de sal
Si una sal es demasiado corta, un atacante puede precalcular una tabla con todas las posibles sales añadidas a cada contraseña probable. Usar una sal larga garantiza que dicha tabla sería prohibitivamente grande. [ 7 ] [ 8 ] 16 bytes (128 bits) o más generalmente son suficientes para proporcionar un espacio suficientemente grande de valores posibles, minimizando el riesgo de colisiones (es decir, que dos contraseñas diferentes terminen con la misma sal).
Beneficios
Para comprender la diferencia entre descifrar una sola contraseña y un conjunto de ellas, consideremos un archivo con usuarios y sus contraseñas cifradas. Supongamos que el archivo no tiene sal. Un atacante podría elegir una cadena, llamarla attempt[0], y luego calcular hash(attempt[0]). Un usuario cuyo hash almacenado en el archivo es hash(attempt[0])puede o no tener la contraseña attempt[0]. Sin embargo, incluso si noattempt[0] es la contraseña real del usuario, se aceptará como si lo fuera, porque el sistema solo puede verificar las contraseñas calculando el hash de la contraseña ingresada y comparándolo con el hash almacenado en el archivo. Por lo tanto, cada coincidencia descifra la contraseña de un usuario, y la probabilidad de una coincidencia aumenta con la cantidad de contraseñas en el archivo. En cambio, si se usan sales, el atacante tendría que calcular , comparar con la entrada A, luego , comparar con la entrada B, y así sucesivamente. Esto evita que un solo intento descifre múltiples contraseñas, dado que se evita la reutilización de la sal. [ 9 ]hash(attempt[0] || salt[a])hash(attempt[0] || salt[b])
Las sales también combaten el uso de tablas precalculadas para descifrar contraseñas. [ 10 ] Dicha tabla podría simplemente asignar contraseñas comunes a sus hashes, o podría hacer algo más complejo, como almacenar los puntos de inicio y fin de un conjunto de cadenas de hash precalculadas . En cualquier caso, el salting puede defenderse contra el uso de tablas precalculadas al alargar los hashes y hacer que extraigan conjuntos de caracteres más grandes, lo que hace menos probable que la tabla cubra los hashes resultantes. En particular, una tabla precalculada tendría que cubrir la cadena [salt + hash]en lugar de simplemente [hash].
El moderno sistema de contraseñas ocultas , en el que los hashes de las contraseñas y otros datos de seguridad se almacenan en un archivo no público, mitiga en cierta medida estas preocupaciones. Sin embargo, siguen siendo relevantes en instalaciones con múltiples servidores que utilizan sistemas centralizados de gestión de contraseñas para distribuir contraseñas o hashes a varios sistemas. En dichas instalaciones, la cuenta de administrador de cada sistema individual puede considerarse menos confiable que los administradores del sistema centralizado de contraseñas, por lo que sigue siendo importante garantizar que la seguridad del algoritmo de hash de contraseñas, incluida la generación de valores de sal únicos, sea adecuada.
Otro beneficio (menor) del uso de un salt es el siguiente: dos usuarios podrían elegir la misma cadena como contraseña. Sin un salt, esta contraseña se almacenaría como la misma cadena hash en el archivo de contraseñas. Esto revelaría que las dos cuentas tienen la misma contraseña, permitiendo que cualquiera que conozca la contraseña de una cuenta acceda a la otra. Al añadir dos caracteres aleatorios a las contraseñas, incluso si dos cuentas usan la misma contraseña, nadie puede descubrirlo simplemente leyendo los hashes. El uso de salt también dificulta enormemente determinar si una persona ha usado la misma contraseña para varios sistemas. [ 11 ]
Implementaciones de Unix
Décadas de 1970 a 1980
Las versiones anteriores de Unix utilizaban un archivo de contraseñas/etc/passwd para almacenar los hashes de las contraseñas con sal (contraseñas precedidas de valores aleatorios de dos caracteres). En estas versiones antiguas de Unix, la sal también se almacenaba en el archivo passwd (en texto plano) junto con el hash de la contraseña con sal. El archivo de contraseñas era de lectura pública para todos los usuarios del sistema. Esto era necesario para que las herramientas de software con privilegios de usuario pudieran encontrar nombres de usuario y otra información. Por lo tanto, la seguridad de las contraseñas está protegida únicamente por las funciones unidireccionales (cifrado o hash) utilizadas para tal fin. Las primeras implementaciones de Unix limitaban las contraseñas a ocho caracteres y utilizaban una sal de 12 bits, lo que permitía 4096 valores de sal posibles. [ 12 ] Este era un equilibrio adecuado para los costos computacionales y de almacenamiento de la década de 1970. [ 13 ]
Desde la década de 1980
El sistema de contraseñas ocultas se utiliza para limitar el acceso a los hashes y al salt. El salt tiene ocho caracteres, el hash tiene 86 caracteres y la longitud de la contraseña es prácticamente ilimitada, salvo errores de desbordamiento de pila.
Implementaciones de aplicaciones web
Es común que una aplicación web almacene en una base de datos el valor hash de la contraseña de un usuario. Sin un valor aleatorio (salt), un ataque de inyección SQL exitoso podría generar contraseñas fácilmente vulnerables. Dado que muchos usuarios reutilizan contraseñas para varios sitios, el uso de un valor aleatorio es un componente importante de la seguridad general de las aplicaciones web . [ 14 ] En la sección de enlaces externos a continuación, encontrará referencias adicionales sobre el uso de un valor aleatorio para proteger los hashes de contraseñas en lenguajes o bibliotecas específicas (PHP, las bibliotecas .NET, etc.) .
Véase también
Referencias
- ↑ Fenton, James L.; Grassi, Paul A.; Garcia, Michael E. (junio de 2017). "Publicación especial NIST 800-63-3" (PDF) . Publicaciones de la serie técnica del NIST .
- ↑ Anderson, Ross (2020). Ingeniería de seguridad: una guía para construir sistemas distribuidos confiables (Tercera ed.). Indianápolis, Indiana: Wiley. ISBN 978-1-119-64281-7OCLC 1224516855
- ↑ Godwin, Anthony (10 de septiembre de 2021). "Las contraseñas importan" . The Bug Charmer (Blog) . Recuperado el 9 de diciembre de 2016 .
- ↑ Boneh, Dan; Shoup, Victor (4 de enero de 2020). Un curso de posgrado en criptografía aplicada (PDF) . págs. 693–695 .
- 1 2 Rosulek, Mike (3 de enero de 2021). "Capítulo 11: Funciones hash" (PDF) . El placer de la criptografía . págs. 204–205 .
- ↑ "Hashing seguro de contraseñas con sal: cómo hacerlo correctamente" . crackstation.net . Consultado el 19 de marzo de 2021 .
- ↑ Menezes, Alfred J.; Oorschot, Paul C. van; Vanstone, Scott A. (1997). Manual de criptografía aplicada . CRC Press. pág. 288. ISBN 0-8493-8523-7.
- ↑ "Hash seguro de contraseñas con sal: cómo hacerlo correctamente (#salt)" . crackstation.net .
- ↑ "Almacenamiento de contraseñas - Serie de guías rápidas de OWASP" . cheatsheetseries.owasp.org . Consultado el 19 de marzo de 2021 .
- ↑ "Cómo funcionan las tablas arcoíris" . kestas.kuliukas.com .
- ↑ Stallings, William; Lawrie Brown (2015). Seguridad informática: principios y práctica (Tercera ed.). Boston: Pearson Higher Ed. ISBN 978-0-13-377392-7OCLC 874734678
- ↑ Morris, Robert; Thompson, Ken (3 de abril de 1978). "Seguridad de contraseñas: un estudio de caso" . Bell Laboratories . Archivado del original el 21 de agosto de 2013.
- ↑ Simson Garfinkel; Gene Spafford; Alan Schwartz (2003). "Cómo Unix implementa las contraseñas" . Seguridad práctica en UNIX e Internet (3.ª ed.). O'Reilly Media. ISBN 9780596003234.
- ↑ "Diario de ISC – Hashing de contraseñas" . Dshield.org . Consultado el 15 de octubre de 2011 .
Enlaces externos
- Guía rápida de almacenamiento de contraseñas de OWASP
- Hash de contraseñas con sal: cómo hacerlo correctamente
- Criptografía
- autenticación de contraseña