¿Bcrypt compara los hashes en el tiempo de "constante de longitud"?

10

Vi esta función slowEquals() mientras leía Hashing de contraseña con sal: hazlo bien , que utiliza un nivel de byte Comparación xor para evitar ataques de tiempo. Me preguntaba si esto es lo que Bcrypt también hace para evitar ataques de tiempo. Utilizo Openwall PHPass que tiene su propio CheckPassword() method que no parece xor. ¿Cómo evita el ataque de tiempo?

    
pregunta DevD 29.11.2013 - 08:44
fuente

2 respuestas

16

Lo bueno del hash es que incluso un cambio de un bit a la entrada cambiará completamente la salida. ¡Mantén esto en tu mente! ¿Cómo se relaciona eso con tu pregunta? Bueno, tengan paciencia conmigo un poco.

En la gran mayoría de los casos, el acceso a la sal implica el acceso al hash de contraseña. Esto es especialmente cierto en el caso de Bcrypt, ya que casi todas las implementaciones almacenan el salt, el hash y el recuento de iteraciones en la misma cadena con delimitadores. También mantén esto en tu mente!

Dado que la comparación se realiza en el hash de la contraseña, y cualquier cambio en la contraseña de entrada cambiará completamente el hash resultante (¿recuerdas?), el rendimiento del ataque de tiempo será información sobre el hash en sí mismo. en el mejor de los casos . Sin embargo, eso es solo verdadero si el atacante tiene acceso a la sal. ¿Recuerdas lo que dijimos? Un acceso a la sal implica acceso al hash. Esto significa que el ataque de tiempo en este caso es irrelevante .

Si el atacante no tiene acceso a la sal, entonces el ataque de tiempo dará (prácticamente hablando) información de cero. Por lo tanto, le dará al atacante una ventaja de cero.

Línea inferior: Para esquemas de hashing como Bcrypt, Scrypt, etc., los ataques de tiempo son irrelevantes. Usar comparaciones como == y === no es un problema. Dicho esto, usar la comparación de tiempo constante es una buena práctica como parte de una política de defensa en profundidad . De hecho, muchas implementaciones de Bcrypt ya utilizaron la comparación segura en el momento por si acaso ( timingsafe_bcmp.c en py-bcrypt , por ejemplo).

Actualizar:

De hecho, existe una forma de extraer información sobre el hash sin conocer ninguno de sus componentes (sal, iteraciones o valor de texto simple). Se describe en un comentario de Oasiscircle

  

Esto todavía puede filtrar partes del hash usando el byte de salida temprana   comparación. Ejemplo: el atacante calcula toneladas de hashes y las almacena   Buscando un hash que comienza con 0x00. Al encontrar un texto en claro   con ese valor, envíe ese texto simple, escuche la sincronización en la respuesta.   Haga esto para 255 valores más hasta que un valor demore un poco más.   Ese es el primer valor de byte del hash creado a partir del texto plano.

Dicho esto, sigo teniendo la misma opinión expresada en la respuesta original sobre la irrelevancia del ataque de tiempo cuando utilizo un esquema de hashing como Bcrypt. Si bien existe la posibilidad de tal ataque, es extremadamente inviable. Los requisitos de cómputo y almacenamiento para tal ataque son enormes, y crecen exponencialmente con cada bit descubierto desde el hash.

    
respondido por el Adi 29.11.2013 - 09:37
fuente
9

bcrypt no compara hashes en absoluto, bcrypt solo hashes. Si comparas el resultado con un $storedHash === $hash ingenuo, entonces eres (teóricamente) susceptible a los ataques de tiempo. Esto se ha planteado en un ticket de Github para PHPass , con la respuesta:

  

He investigado esto anteriormente, y toda mi investigación indica que esto no es necesario cuando se trata de técnicas de hashing de contraseñas adecuadas. Incluso el artículo que vincula indica que "el uso de hashing unidireccional debería vencer esto porque es muy difícil trabajar hacia atrás a partir de fugas de tiempo cuando la entrada derivada del atacante sigue cambiando (hash a un resumen diferente cada vez que un byte cambia en la entrada de texto sin formato original) . "

     

Me complacerá volver a ver esto, pero estos problemas están más relacionados con la divulgación accidental de datos que con el descifrado de contraseñas de fuerza bruta cuando se utilizan hashes.

Por lo tanto, PHPass no intenta explícitamente evitar tales ataques de tiempo, y el autor no considera que el problema sea un problema.

La implementación de bcrypt "oficial" para el hashing de contraseña en PHP es password_hash y password_verify , el último de los cuales hace implementar una comparación xor de tiempo constante . Hay una implementación del usuario para versiones de PHP por debajo de 5.5.

    
respondido por el deceze 29.11.2013 - 09:20
fuente

Lea otras preguntas en las etiquetas