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.