¿Hay valor en almacenar contraseñas en su propia tabla con claves cifradas o con hash?

2

El método habitual para sitios simples es almacenar un hash de la contraseña de un usuario en su registro de usuario.

¿Qué sucede si el campo de contraseña se elimina de la tabla de usuarios y se crea una tabla de contraseñas? La tabla de contraseñas tendría el mismo hash de contraseña, pero en lugar de la ID de usuario, la clave de la tabla es otro hash: un hash del ID de usuario y alguna clave secreta.

La idea es que si obtienes una copia de la tabla de usuarios, no obtendrás los hashes de contraseña. Si obtiene el usuario y la tabla de contraseñas, no podrá conectar una contraseña a ninguna cuenta de usuario en particular.

Supongo que si pudiera romper el hash de contraseña, tendría un puñado de contraseñas que sabe que están en uso en el sistema. Puedes probar cada contraseña en cada cuenta hasta que funcione. Así que tal vez respondí a mi propia pregunta. Sin embargo, ¿hay algo que me falta? Se siente como una buena idea, pero no pude encontrar nada al respecto.

Supongo que podría ser fácil detectar un ataque que está utilizando una lista de contraseñas que existen para los usuarios en el sistema y bloquear o cerrar el ataque de otra manera.

    
pregunta Thomas Pornin 14.12.2012 - 16:15
fuente

5 respuestas

2

Si usa una función de hashing de contraseña criptográfica apropiada (por ejemplo, bcrypt, scrypt o PBKDF2), el valor agregado por este enfoque es insignificante. Así que, en realidad, la solución es simplemente copiar sus contraseñas de manera responsable en primer lugar.

    
respondido por el Stephen Touset 14.12.2012 - 22:53
fuente
2

Eche un vistazo a mi respuesta aquí hablando sobre la información de segregación de contraseñas. Combinado con un conjunto de permisos diferente que no permite la lectura pero que permite la comparación por medio de un procedimiento almacenado, la separación de la información de la contraseña sería realmente útil.

No puede ir efectivamente cifrando o haciendo hashing de valores clave porque la salida sería aleatoria. O bien necesitaría un espacio lo suficientemente grande para evitar colisiones y luego se encontraría con cantidades dolorosas de fragmentación de la base de datos donde se producen inserciones en todo el lugar y las páginas se dividen. Los valores clave deben permanecer incrementando los enteros para la cordura de todos.

  

Supongo que podría ser fácil detectar un ataque que está utilizando una lista de contraseñas que existen para los usuarios en el sistema y bloquear o cerrar el ataque de otra manera.

No. Eso implicaría verificar la lista completa de posibles hashes, lo que sería costoso si ha utilizado métodos adecuados de salazón y hashing.

    
respondido por el Jeff Ferland 18.12.2012 - 00:52
fuente
1

Si comparte con sal y contraseñas sus contraseñas de manera adecuada, el sistema que usted propone no agrega ningún valor. Si un atacante puede obtener una base de datos, probablemente puede obtener ambas. Un hash agregado en la clave externa no proporciona ningún aumento apreciable en la seguridad más allá del hashing de sus contraseñas.

Además, dependiendo de cómo implemente dicho sistema, podría causar pérdidas sustanciales de rendimiento.

    
respondido por el Aurand 18.12.2012 - 00:28
fuente
0

Esto es seguridad por oscuridad, OMI. El paso adicional del hashing de la ID de usuario para generar una contraseña es trivial para recrear una vez que se conoce. Debido a que los nombres de usuario no se almacenan en forma de hash en su tabla de usuarios, y porque algo, en algún lugar, debe tener acceso de lectura a ambas bases de datos, si un atacante puede obtener un volcado de su tabla de usuarios y obtener nombres de usuarios, puede obtener un volcado de la tabla de contraseñas también y conecte los puntos. Lo único desconocido es el algoritmo de hash utilizado, y debido a que hay un pequeño número de funciones hash seguras adecuadas para este propósito, es trivial probarlas todas (y no piense ni por un minuto que estoy abogando por crear su propio hash). o usar uno oscuro, eso es más seguridad por oscuridad).

Si el método de hashing es seguro y la contraseña tiene una entropía no trivial ( las 10 contraseñas más comunes más comunes y derivaciones simples de los mismos tienen efectivamente cero entropía, ya que son lo primero que intentará hacer un cracker), puede pintar con aerosol su hash de contraseña en su automóvil y conducirlo a la mitad de DEF CON y estará perfectamente bien. Ese es el punto; el ataque más eficiente del hash ideal debería ser el ataque de cumpleaños, que aún debería ser inviable con la combinación adecuada de entropía de entrada, tamaño de compendio y costo computacional.

    
respondido por el KeithS 17.12.2012 - 23:09
fuente
0

Hashea las contraseñas por una razón específica: en caso de que un atacante pueda obtener una copia de las tablas de su servidor. Hundimos contraseñas para evitar que el atacante incremente un acceso parcial de solo lectura a un acceso de lectura-escritura (consulte esta entrada de blog para una discusión más detallada). El hash de contraseñas ya es una segunda capa de defensa.

Su propuesta es acerca de agregar una tercera capa: tiene valor solo si el escenario de ataque es que el atacante podría obtener un acceso de solo lectura en la tabla one pero no en ambas. Sin embargo, este escenario no es muy realista, ya que tal acceso de solo lectura proviene a menudo de ataques de inyección de SQL, y los elementos del servidor que tienen el permiso para leer la tabla de usuarios a menudo también tienen el permiso de leer la contraseña con hash (en particular el sistema de inicio de sesión, que debe, por definición, utilizar ambos).

Por lo tanto, debe equilibrar la seguridad adicional con la complejidad adicional, ya que se sabe que la complejidad es el enemigo enemigo de la seguridad. En ese caso, no creo que la complejidad adicional valga la pena, ya que el escenario para el que la división de la tabla agregaría algo de seguridad es inverosímil.

    
respondido por el Thomas Pornin 28.12.2012 - 16:21
fuente

Lea otras preguntas en las etiquetas