La necesidad de ocultar la sal para un hash


En el trabajo tenemos dos teorías que compiten por las sales. Los productos en los que trabajo usan algo así como un nombre de usuario o un número de teléfono para salar el hash. Esencialmente algo que es diferente para cada usuario, pero está fácilmente disponible para nosotros. El otro producto genera aleatoriamente una sal para cada usuario y cambia cada vez que el usuario cambia la contraseña. La sal se encripta en la base de datos.

Mi pregunta es si el segundo enfoque es realmente necesario? Puedo entender desde un punto de vista puramente perspectiva teórica que es más seguro que el primer enfoque, pero ¿qué pasa desde un punto de vista práctico. Ahora mismo para autenticar a un usuario, la sal debe estar sin cifrar y aplicada a la información de inicio de sesión.

Después de pensarlo, simplemente no veo una ganancia real de seguridad de este enfoque. Cambiar la sal de una cuenta a otra, todavía hace que sea extremadamente difícil para alguien intentar forzar brutalmente el algoritmo de hash, incluso si el atacante era consciente de cómo para determinar rápidamente lo que era para cada cuenta. Esto va en el supuesto de que las contraseñas son lo suficientemente fuertes. (Obviamente, encontrar el hash correcto para un conjunto de contraseñas donde todas son dos dígitos es significativamente más fácil que encontrar el hash correcto de contraseñas que son 8 dígitos). ¿Estoy equivocado en mi lógica, o hay algo que me falta?

EDIT: Bien, esta es la razón por la que creo que es realmente discutible cifrar la sal. (déjame saber si Estoy en el camino correcto).

Para la siguiente explicación, asumiremos que las contraseñas son siempre 8 caracteres y la sal es 5 y todas las contraseñas están compuestas de letras minúsculas (solo hace que las matemáticas sean más fáciles).

Tener una sal diferente para cada entrada significa que no puedo usar la misma tabla rainbow (en realidad técnicamente podría si tuviera una de tamaño suficiente, pero ignoremos eso por el momento). Esta es la verdadera clave de la sal de lo que entiendo, porque para crack cada cuenta tengo que reinventar la rueda por así decirlo para cada uno. Ahora, si sé cómo aplicar la sal correcta a una contraseña para generar el hash, lo haría porque una sal realmente solo extiende la longitud/complejidad de la frase hash. Así que estaría cortando el número de combinaciones posibles que necesitaría generar para "saber" Que tengo la contraseña + sal de 13^26 a 8^26 porque sé lo que es la sal. Ahora eso lo hace más fácil, pero todavía muy difícil.

Así que en cifrando la sal. Si sé que la sal está encriptada, no intentaría descifrarla (suponiendo que sé que tiene un nivel suficiente de encriptación) primero. Lo ignoraría. En lugar de tratar de averiguar cómo descifrarlo, volviendo al ejemplo anterior, generaría una tabla rainbow más grande que contiene todas las claves para el 13^26. Sin saber la sal definitivamente me retrasaría, pero no creo que agregaría la tarea monumental de tratar de descifrar el cifrado de salt primero. Por eso No creo que valga la pena. ¿Pensamientos?

Aquí hay un enlace que describe cuánto tiempo se mantendrán las contraseñas bajo un ataque de fuerza bruta: http://www.lockdown.co.uk/?pg=combi

Author: ErikE, 2008-10-17

10 answers

La respuesta aquí es preguntarse de lo que realmente está tratando de proteger? Si alguien tiene acceso a su base de datos, entonces tienen acceso a las sales cifradas, y probablemente también tengan acceso a su código. ¿Con todo eso podrían descifrar las sales cifradas? Si es así, entonces el cifrado es prácticamente inútil de todos modos. La sal realmente está ahí para hacerlo, por lo que no es posible formar una tabla rainbow para descifrar toda su base de datos de contraseñas de una sola vez si se rompe. De ese punto de vista, siempre y cuando cada sal sea única no hay diferencia, se requeriría un ataque de fuerza bruta con sus sales o las sales cifradas para cada contraseña individualmente.

 40
Author: tloach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-10 22:50:29

Ocultar una sal es innecesario.

Se debe usar una sal diferente para cada hachís. En la práctica, esto es fácil de lograr al obtener 8 o más bytes del generador de números aleatorios de calidad criptográfica.

De una respuesta previa mía :

Salt ayuda a frustrar los ataques de diccionario pre-calculados.

Supongamos que un atacante tiene una lista de posibles contraseñas. Él puede hachís cada uno y compararlo con el hash de la contraseña de su víctima, y ver si coincidir. Si la lista es grande, esto podría llevar mucho tiempo. Él no quiere pasar tanto tiempo en su próximo objetivo, por lo que registra el resultado en un "diccionario" donde un hash apunta a su entrada correspondiente. Si la lista de contraseñas es muy, muy larga, puede usar técnicas como Mesa arco iris para ahorrar algo de espacio.

Sin embargo, supongamos que su próximo objetivo saltó su contraseña. Incluso si el el atacante sabe lo que es la sal, su tabla precalculada es sin valor - la sal cambia el hash resultante de cada contraseña. He tiene que re-hash todas las contraseñas en su lista, fijando el objetivo de sal a la entrada. Cada sal diferente requiere una sal diferente diccionario, y si se utilizan suficientes sales, el atacante no tendrá espacio para almacenar diccionarios para todos ellos. Espacio de negociación para ahorrar tiempo no es más larga una opción; el atacante debe recurrir a hash cada contraseña en su lista para cada objetivo que quiere atacar.

Por lo tanto, no es necesario mantener la secreto de sal. Garantizar que la el atacante no tiene un diccionario pre-calculado correspondiente a eso la sal particular es suficiente.


Después de pensar un poco más en esto, me he dado cuenta de que engañarse a sí mismo pensando que la sal puede estar oculta es peligroso. Es mucho mejor asumir que la sal no se puede ocultar, y diseñar el sistema para que sea seguro a pesar de eso. Proporciono una explicación más detallada en otra respuesta.

 92
Author: erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-14 14:32:35

Mi comprensión de "salt" es que hace que el agrietamiento sea más difícil, pero no intenta ocultar los datos adicionales. Si está tratando de obtener más seguridad haciendo que la sal sea "secreta", entonces realmente solo desea más bits en sus claves de cifrado.

 3
Author: gbarry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-17 18:57:24

El segundo enfoque es solo un poco más seguro. Las sales protegen a los usuarios de ataques de diccionario y ataques de tabla rainbow. Hacen que sea más difícil para un atacante ambicioso comprometer todo su sistema, pero todavía son vulnerables a los ataques que se centran en un usuario de su sistema. Si usas información que está disponible públicamente, como un número de teléfono, y el atacante se da cuenta de esto, entonces le has guardado un paso en su ataque. Por supuesto, la pregunta es discutible si el atacante obtiene toda su base de datos, sales y todo.

EDIT: Después de releer esta respuesta y algunos de los comentarios, se me ocurre que parte de la confusión puede deberse al hecho de que solo estoy comparando los dos casos muy específicos presentados en la pregunta: sal aleatoria vs sal no aleatoria. La cuestión de usar un número de teléfono como saltes discutible si el atacante obtiene toda su base de datos, no la cuestión de usar una salt en absoluto.

 3
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-08 12:30:31

Una sal oculta ya no es sal. Es Pepper. Tiene su uso. Es diferente de la sal.

Pepper es una clave secreta añadida a la contraseña + salt que convierte el hash en un HMAC (Código de autenticación de mensajes basado en Hash). Un hacker con acceso a la salida de hash y la salt puede teóricamente adivinar por fuerza bruta una entrada que generará el hash (y por lo tanto pasar la validación en el cuadro de texto contraseña). Al agregar pimienta, aumenta el espacio problemático en un espacio criptográficamente aleatorio manera, haciendo el problema intratable sin hardware serio.

Para obtener más información sobre pepper, consulte aquí.

Véase también hmac.

 3
Author: John Wu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 13:14:46

Aquí hay un ejemplo simple que muestra por qué es malo tener la misma sal para cada hash

Considere la siguiente tabla

UserId  UserName,   Password
     1  Fred       Hash1 =  Sha(Salt1+Password1)    
     2  Ted        Hash2 =  Sha(Salt2+Password2)    

Caso 1 cuando sal 1 es igual a sal2 Si Hash2 se reemplaza con Hash1, el usuario 2 podría iniciar sesión con la contraseña del usuario 1

Caso 2 cuando la sal 1 no es la misma sal2 Si Hash2 se reemplaza por Hash1, el usuario 2 no puede iniciar sesión con la contraseña de usuarios 1.

 2
Author: Charles Faiga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-17 19:14:50

... algo así como un nombre de usuario o número de teléfono para salar el hash. ...

Mi pregunta es si el segundo enfoque es realmente necesario? Puedo entender desde una perspectiva puramente teórica que es más seguro que el primer enfoque, pero ¿qué pasa desde un punto de vista práctico?

Desde un punto de vista práctico, un salt es un detalle de implementación. Si alguna vez cambia la forma en que se recopila o mantiene la información del usuario – y tanto los nombres de usuario como el teléfono los números a veces cambian, para usar sus ejemplos exactos, entonces puede haber comprometido su seguridad. ¿Quieres que un cambio tan externo tenga preocupaciones de seguridad mucho más profundas?

Detener el requisito de que cada cuenta tenga un número de teléfono debe implicar una revisión de seguridad completa para asegurarse de que no ha abierto esas cuentas a un compromiso de seguridad?

 2
Author: Anon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-15 03:04:56

Hay dos técnicas, con diferentes objetivos:

  • La "sal" se usa para hacer que dos contraseñas iguales se cifren de manera diferente. De esta manera, un intruso no puede usar eficientemente un ataque de diccionario contra toda una lista de contraseñas cifradas.

  • El "secreto" (compartido) se agrega antes de hashear un mensaje, para que un intruso no pueda crear sus propios mensajes y hacerlos aceptar.

 1
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-17 19:15:04

Tiendo a esconder la sal. Uso 10 bits de sal anteponiendo un número aleatorio del 1 al 1024 al principio de la contraseña antes de hash. Al comparar la contraseña introducida por el usuario con el hash, hago un bucle del 1 al 1024 y pruebo cada valor posible de salt hasta encontrar la coincidencia. Esto toma menos de 1/10 de segundo. Tengo la idea de hacerlo de esta manera desde el PHP password_hash y password_verify. En mi ejemplo, el "costo" es 10 por 10 bits de sal. O desde lo que otro usuario dijo, oculto "sal" se llama "pimienta". La sal no está cifrada en la base de datos. Es bruto forzado a salir. Haría necesaria la tabla rainbow para revertir el hash 1000 veces más grande. Utilizo sha256 porque es rápido, pero todavía se considera seguro.

 0
Author: Russell Hankins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-04 22:17:25

Realmente, depende del tipo de ataque que esté tratando de proteger sus datos.

El propósito de una sal única para cada contraseña es evitar un ataque del diccionario contra toda la base de datos de contraseñas.

Cifrar la sal única para cada contraseña haría más difícil descifrar una contraseña individual, sí, pero debe sopesar si realmente hay mucho beneficio. Si el atacante, por fuerza bruta, encuentra que esta cadena:

Marianne2ae85fb5d

Hashes a un hash almacenado en la base de datos, ¿es realmente tan difícil averiguar qué parte es el pase y qué parte es la sal?

 -1
Author: Lucas Oman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-17 19:16:43