Hashing del lado del cliente para disminuir el valor de las heurísticas de adivinación de contraseñas

3

Sí, esta es la pregunta de 'otro hashing del lado del cliente'. Pero, no te vayas todavía, creo que hay algo de valor aquí.

Me gustaría hacer algo para mitigar el efecto en la comunidad en general cuando me roben la base de datos de hash de contraseña. (Ver: LinkedIn, Match.com, Yahoo, etc ...)

En esos casos, el análisis estadístico de las contraseñas filtradas se ha utilizado para mejorar las heurísticas para detectar el craqueo de la contraseña de un usuario. Me gustaría ayudar a evitar que eso suceda.

Aquí está la idea: tome la contraseña de texto simple del usuario, haga un hash lento en el lado del cliente tantas veces como sea posible. Luego, use el hash como la contraseña pasada al servidor. Trate la contraseña-hash del cliente como si fuera una contraseña normal y vuelva a utilizar el hash lento en el lado del servidor.

Esto debería hacer que mi base de datos de contraseñas sea inmune a los ataques heurísticos. (Bueno, en realidad no es inmune, solo es costoso usar las heurísticas).

Sin embargo, mi preocupación es que la reducción de la entropía en la producción de hash del lado del cliente podría eliminar las ganancias que encontré al eliminar el valor de las heurísticas.

¿Cómo se puede cuantificar esta compensación? ¿Alguna idea sobre el enfoque?

Editar

Para ser claros, estoy tratando de hacer que los ataques heurísticos sean menos valiosos. es decir, quiero que 'Contraseña1' sea una contraseña tan buena como 'tqwe657fdh'. Es decir, un atacante tendrá que buscar el mismo espacio para descifrar cualquiera de los dos.

Otra edición

La discusión me ha ayudado a aclarar mis pensamientos:

Con las recientes filtraciones de muchas bases de datos de contraseñas grandes y el análisis resultante de las contraseñas y los patrones comunes, creo que las heurísticas utilizadas en los sistemas de descifrado de contraseñas deben haberse mejorado.

Los avances recientes con la ejecución de hash asistida por GPU ( enlace ) están cambiando el beneficio de desequilibrio de la CPU hacia el atacante. (De todos modos, ya estaba bastante desequilibrado. Es una tarea difícil manejar las contraseñas de hash lento en el hardware del servidor centralizado una vez que el sistema se acerca a la escala de Internet).

Quiero hacer dos cosas:

Elimine el beneficio que mi atacante recibe de las heurísticas, forzando así un verdadero ataque de fuerza bruta.

Disminuye el beneficio que mi base de datos de contraseñas tendrá para la comunidad cracker una vez que me sea robada.

Sospecho que mi idea podría ayudar, pero necesito una forma de cuantificar las compensaciones.

    
pregunta brendanjerwin 04.03.2013 - 16:51
fuente

3 respuestas

5

Sobre la base de la teoría de contraseñas estándar, esto no debería funcionar ya que tenemos que asumir que el método de generación de contraseñas es conocido.

Creo que lo que estás preguntando es esto, corrígeme si me equivoco.

Su comprensión del método estándar.

Usuario 1 - (enviado) contraseña1 - > (almacenado) e38ad214943daad1d64c102faec29de4afe9da3d

Usuario 2 - (enviado) Di # aKHn! @ - > (almacenado) 9187b4dc0f7c7231334546a86984060233304c5e

El ataque del diccionario en los hashes almacenados recupera las contraseñas enviadas ¿verdad?

Lo que quieres hacer es esto.

Usuario 1 - (lado del cliente) contraseña1 - > (enviado) e38ad214943daad1d64c102faec29de4afe9da3d - > (almacenado) f8fde4f28c22e1a5a6201b6cce363477940cde50

Usuario 2 - (lado del cliente) Di # aKHn! @ - > (enviado) 9187b4dc0f7c7231334546a86984060233304c5e - > (almacenado) a893a40df9fc73ab3a9711a34e943f13271170c1

Entonces, la contraseña para el usuario 1 es aparentemente tan fuerte como la contraseña del usuario 2, porque ambos están enviando cadenas alfanuméricas de 40 caracteres como contraseñas, y los ataques al hash final almacenado no funcionarán * porque el hash no estaba ' t generado por una palabra del diccionario, pero un hash largo.

La razón por la que esto no funcionará es que el proceso es parte de la lógica del programa en lugar de la entropía en el lado humano. El craqueo de la contraseña simplemente se convierte en SHA1 (SHA1 ($ pass)) en lugar de SHA1 ($ pass) o cualquier otro control que tenga (salting, etc.). Dada la necesidad de repetibilidad, no se puede eliminar un número aleatorio de veces en el lado del cliente, siempre se debe definir.

Si he entendido mal lo que estás sugiriendo, házmelo saber.

Editar: para ampliar aún más lo que creo que estás diciendo acerca de los comentarios a continuación.

Quieres que el hashing tome X tiempo, donde X es el punto en el que no es práctico ejecutar ataques de diccionario. Está diciendo que, dados los recursos del servidor, el uso de un hash lento como bcrypt solo puede lograr una ralentización del tiempo 'Y', que no es suficiente para superar el umbral de 'X'. La idea es utilizar la CPU del cliente también como 'Z', por lo que ahora tiene Y + Z hasta el punto en el que, con suerte, está logrando este umbral 'X' de ataques de diccionario inútiles.

Mi respuesta sería que dudo que haya suficiente potencia de CPU entre el cliente y el servidor para que esto no sea práctico para que alguien intente un ataque de diccionario, mientras mantiene un servicio utilizable. Esto se debe a que la diferencia entre los cálculos de GPU y los cálculos de CPU es muy grande.

    
respondido por el Peleus 04.03.2013 - 22:06
fuente
3

Para la base de datos resultante, no importa si el hash se produce del lado del cliente o del lado del servidor . El atacante ve un hash e intenta contraseñas.

El hashing del lado del cliente tiene las siguientes consecuencias principales:

  • la CPU se gasta en el cliente, no en el servidor; ya que un servidor puede tener que administrar 100 clientes a la vez, mientras que el cliente iniciará sesión en un solo servidor a la vez, esto parece un uso eficiente de la CPU disponible.
  • Sin embargo, CPU en el cliente significa, en un contexto web, Javascript. Esto es más como el 1% de la CPU, debido a la sobrecarga de Javascript (incluso con la compilación JIT, Javascript no es realmente bueno en tareas que requieren un uso intensivo de la CPU).
  • Como el hashing requiere conocimiento del salt , debe cambiar el protocolo: el cliente envía el nombre de usuario, el servidor responde con el salt y solo el cliente hace el hashing. Esto puede o no ser fácil de aplicar en un protocolo dado; implica un viaje de ida y vuelta adicional.

Así no habrá un gran aumento de seguridad de esa manera. Las cosas cambian si puede tener almacenamiento en el cliente. De esa manera, podría almacenar una clave (algo secreto) en el cliente, y usar un MAC calculada sobre la contraseña del usuario (como se escribe) como la "contraseña" que se enviará al servidor. Dado que un atacante que hackeó un servidor consiguió la base de datos, pero no todo lo que está almacenado en el cliente, esto trae el "servicio comunitario" que está buscando. Por otro lado, el almacenamiento de claves en el cliente trae su propio conjunto de problemas (en particular, el usuario ya no puede cambiar de máquina fácilmente; la clave debe ser transportada de una máquina a otra). Se puede usar un servidor de almacenamiento dedicado para ayudar con estos problemas de almacenamiento. En gran medida, esta solución es el modelo KeePass .

    
respondido por el Thomas Pornin 04.03.2013 - 17:03
fuente
0

No hay ninguna ganancia particular en el servidor o el cliente; efectivamente, parece que solo está utilizando un resultado intermedio como punto de transferencia entre el hashing del lado del cliente y del servidor. Obtendrá un ahorro en el rendimiento para hacer que un hash disponible de otro modo sea un costo prohibitivo, pero en última instancia, dado que el cliente está devolviendo el hash intermedio como una entrada válida, el atacante solo tiene que contrarrestar la versión del servidor.

Digamos que ejecuto 1000 iteraciones de un hash localmente en "mypassword" para obtener un valor de "jdqfr3bt". Luego, el cliente debe proporcionar eso al servidor y el servidor realiza las 10 iteraciones que puede realizar para obtener "91jf35j" que coincide con la base de datos, por lo que lo permite.

Ahora, como atacante, obtengo 91jf35j de la base de datos y busco hasta que encuentre que el valor "jdqfr3bt" coincide. Luego simplemente proporciono eso como el "resultado" del hash del lado del cliente sin molestarme en hacer nada. El servidor lo ve como válido. Esto hace que sea más costoso comenzar desde un diccionario, pero una tabla de arco iris puro no se verá afectada.

    
respondido por el AJ Henderson 04.03.2013 - 19:36
fuente

Lea otras preguntas en las etiquetas