Hash de contraseña sin una sal única

0

Tengo una pregunta sobre el hashing de contraseñas. Esta no es una pregunta sobre el método MEJOR POSIBLE de hashing de contraseñas, sino más bien una pregunta más útil sobre qué es suficiente para hash una contraseña sin que las tablas estándar del arco iris sean un problema.

Déjame delinear un escenario hipotético. Tiene una aplicación que está diseñada sin sales únicas, y por cualquier motivo de diseño, sería una gran modificación cambiar la aplicación para que funcione con una sal única para cada usuario individual. Entonces, en lugar de reescribir una gran parte de la aplicación, estamos buscando una forma de hash de contraseñas que sea más segura que un SHA1 puro (o cualquier algoritmo de hash estándar), pero que no implique sales únicas.

Daré dos ejemplos de soluciones que no involucran sales únicas. Cada uno tiene la ventaja obvia de representar una tabla de arco iris para un SHA1 puro (o cualquier otro algoritmo de hashing estándar) inútil. Sin embargo, cada uno tiene la desventaja de poder crear una tabla de arco iris para esa estrategia en particular. Pero si lo piensas bien, usar una sal única tiene la misma vulnerabilidad, si tuvieras que apuntar a un solo usuario.

La idea más simple es tener un solo salt para todas las contraseñas codificadas. El segundo es llegar a un algoritmo más complicado, como dividir una contraseña en dos por un conjunto definido de reglas, hacer hashing en cada una, luego hashing la concatenación de los dos hashes parciales y almacenarlos. Esto se puede extender a cualquier algoritmo que desee.

¿Este método es suficiente para la mayoría de las aplicaciones? Obviamente, ninguno de los dos es tan seguro como una sal única para cada usuario, pero si estaba apuntando a un usuario específico, no parece ni más ni menos seguro si conoce la sal para ese usuario en particular.

¿Eso es correcto? ¿Y es una solución viable para algunos (o quizás la mayoría) de los casos?

    
pregunta 01.05.2014 - 03:44
fuente

4 respuestas

2

El fundamento de las sales únicas no es simplemente combatir las tablas de arco iris. Si toda la base de datos de contraseñas está encriptada sin sales (o solo con un salt), entonces un atacante puede atacar toda la base de datos de contraseñas simultáneamente en lugar de ser forzado a atacar cada contraseña individualmente.

También, como ha señalado mcdowella, una base de datos de contraseñas que no está protegida por sales únicas puede potencialmente ser víctima de un atacante extrapolando información del hecho de que se observa que varios usuarios comparten la misma contraseña.

Ninguna de sus soluciones resuelve ninguno de estos problemas. Puede hacer que el ataque sea más costoso computacionalmente usando algo más seguro que sha1 (un alto conteo de iteraciones PBKDF, por ejemplo) pero eso no es un reemplazo para sales únicas. Son fáciles de implementar y la relación costo / beneficio de la salazón única en términos de tiempo de cómputo adicional y mayor dificultad para atacar es mejor que casi cualquier otro enfoque único.

    
respondido por el Aurand 01.05.2014 - 07:10
fuente
2

Lea primero las formas normales de realizar el hashing de contraseñas y sobre el uso de Pepper . Luego, debe considerar si realmente no puede almacenar información junto con el hash en su base de datos, por ejemplo. De la forma que ha sugerido mcdowella. Si tiene la pimienta adecuada en su hash, entonces su sal no tiene que ser aleatoria, sino diferente para cada cambio de contraseña. Por ejemplo, use la hora actual en milisegundos, así como el ID de la cuenta, para generar el salt (puede concatenarlos o incluso marcarlos una vez con SHA * si la longitud variable es un problema para su base de datos). Si por alguna razón no puede almacenar nada, excepto el hash, incluya al menos el ID de cuenta como salt en su esquema de hashing de contraseña. Y como siempre con el hashing de contraseñas: use una función hash lenta (excepto la idea anterior para la generación de sal).

    
respondido por el Perseids 01.05.2014 - 10:43
fuente
1

Un problema con un algoritmo que no tiene sales únicas es que dos usuarios con la misma contraseña obtendrán el mismo valor. Si un usuario ve esto, conoce la otra contraseña. Si un atacante externo ve esto, tienen una pista de que los usuarios han elegido una contraseña común, y por lo tanto débil. ¿No puede usar un salt único y almacenarlo formateado como parte de la contraseña hash? P.ej. almacene "SALT # HASHVALUE" como la contraseña hash.

    
respondido por el mcdowella 01.05.2014 - 06:38
fuente
0

Lamento responder mi propia pregunta tan pronto, pero Stackoverflow tuvo algunas buenas respuestas sugeridas. Como es de esperar, todo se reduce al tiempo de cálculo. Si usa un algoritmo que demora un segundo en ejecutar un hash de una contraseña, puede multiplicar esos millones para obtener la carga de cálculo en una máquina que intenta generar una tabla de arco iris para su algoritmo. Así que supongo que, con o sin sales únicas, debe crear tantos pasos como sea posible para hash una contraseña sin una gran carga en su servidor. Puede ejecutar su entrada a través del mismo algoritmo de forma recursiva 1000 veces. Puedes conseguir más complicado que eso. Todo se reduce a la cantidad de cálculos que se requieren para calcular una contraseña individual.

    
respondido por el Ryan Williams 01.05.2014 - 04:10
fuente

Lea otras preguntas en las etiquetas