Estaré encantado de explicar mis comentarios aún más :-)
Lamentablemente no es una explicación simple.
Para una contraseña con hash bcrypt, ¿qué ventaja le daría esto al atacante? ¿Se puede cuantificar esto?
Es difícil cuantificar esto, ya que es difícil adivinar el tiempo de ejecución de un algoritmo, especialmente si el atacante puede crear chips especializados para el trabajo.
Así que no hay matemáticas sofisticadas :-( pero todavía puedo dar una respuesta basada en la intuición;
bcrypt está diseñado para las contraseñas de hashing de una manera que es robusta a los ataques de diccionarios sin conexión, lo que significa que, entre otras cosas, es lenta . Lento significa que un atacante con fuerza bruta tiene que hacer más cálculos por conjetura, y por lo tanto no puede hacer tantas conjeturas por segundo. O, en términos económicos, la cantidad de dinero que un atacante tiene que gastar en procesadores y electricidad para descifrar tu contraseña se dispara cuando usas una función hash lenta y agradable.
Para ilustrar el punto, esta tabla, tomada de un artículo de Colin Percival (referencia completa a continuación), muestra el costo estimado del hardware que necesitaría para poder descifrar un hash en un año (tenga en cuenta que este es el costo por el número de procesadores de la era 2002 que necesitaría, ignora completamente los costos de electricidad, suministro de energía, refrigeración, etc.).
Ahoraquehemosestablecidoquelentoesbuenoyquelasbuenasfuncioneshashsonlentas,hablemosdezxcvbn.
zxcvbnestápensadoparaserunaherramientajavascriptqueseejecutaenelladodelclientesinretrasarseenlapágina,porloque,encomparaciónconPBKDF2,bcryptyscrypt,seestáacelerando.
Pararesponderatupregunta,imaginaquerobéunabasededatosdecontraseñasdondecadafilaseveíaasí(queesloquecreoque@ScottArciszewskiestabadescribiendoensucomentario aquí ):
username bcrypt_hash bgcypt_salt zxcvbn_score
happyfish23 IjZAgcfl7p92ldGxad68LJZdL17lhWy N9qo8uLOickgx2ZMRZoMye 32.827
Por lo general, un ataque de fuerza bruta tomará una contraseña de su diccionario, la modificará y verá si el hash coincide con la de la base de datos robada. Si es así, he descifrado su contraseña. De lo contrario, sigo intentando hasta que encontrar uno que coincida. (Esto se puede hacer en línea uno a la vez cuando se adivinan las contraseñas, o como una tabla de arco iris pre-computada, pero de cualquier manera, reducir la velocidad y el tiempo cuesta dinero y dinero, especialmente porque necesita una tabla de arco iris diferente para cada combinación alg + iteration_count salt
)
Con el acceso a la base de datos anterior, podría usar el puntaje zxcvbn como filtro; Si las puntuaciones de zxcvbn no coinciden, entonces ya sé que no es la contraseña correcta y no tiene sentido perder tiempo en el cálculo de bcrypt. Por lo tanto, solo necesito calcular bcrypt si zxcvbn coincide. Dado que zxcvbn es básicamente gratuito, en comparación con bcrypt, no es irrazonable que un forzador bruto pueda pasar de 10 suposiciones / segundo a millones de suposiciones / segundo usando este truco. / p>
En cuanto a la segunda parte de tu pregunta:
También, otros comentarios mencionan que reducir la precisión de la entropía reduce la ventaja del atacante. ¿Almacenar solo la puntuación (0, 1, 2, 3 o 4) eliminaría efectivamente la ventaja?
Sí, esto eliminaría efectivamente la ventaja. La razón por la que básicamente se sale de la explicación anterior. Supongamos que la base de datos original almacena una puntuación zxcvbn de 5 dígitos, y que las contraseñas en el diccionario de fuerza bruta se distribuyen uniformemente sobre las puntuaciones zxcvbn (una suposición terrible, pero facilita la lógica). Solo esperaría que los puntajes de zxcvbn coincidieran con 1 / 100,000 de las veces, por lo que solo tiene que calcular un bcrypt por cada 100,000. Pero si, en cambio, almacena una versión de menor precisión de la puntuación, por ejemplo, {0,1,2,3,4}
, entonces se vería obligado a calcular bcrypt por cada 5 suposiciones. Aún le estás dando al atacante una aceleración de ~ 5x, pero eso es WAAAYY mejor que una aceleración de 100,000x.
REFERENCIA:
Percival, Colin. "Derivación de clave más fuerte a través de funciones secuenciales de memoria dura". Autopublicado (2009): p. 14 (enlace a pdf)