2011-08-16 14 views
14

Cómo es bcrypt más fuerte que, por ejemplo,¿Cuál es la diferencia entre bcrypt y hashing varias veces?

def md5lots(password, salt, rounds): 
    if (rounds < 1) 
     return password 
    else 
     newpass = md5(password + salt) 
     return md5lots(newpass, salt, rounds-1) 

me da la sensación, dada su bombo, que las personas más inteligentes que me han dado cuenta de que bcrypt es mejor que esto. ¿Alguien podría explicar la diferencia en términos de 'inteligente lego'?

+1

El número de rondas en bcrypt es '2^i' por lo que es un crecimiento exponencial, pero, muy buena pregunta ... en una nota relacionada, sería interesante comparar bcrypt con un hash HMAC en términos de" adicional endurecimiento". –

Respuesta

3

Hay tres diferencias significativas entre bcrypt y hash varias veces con MD5:

  1. El tamaño de la salida: 128 bits (16 bytes) para los bits MD5 y 448 (56 bytes) para bcrypt. Si almacena millones de hashes en una base de datos, esto debe tenerse en cuenta.
  2. Se pueden producir colisiones y ataques de preimagen contra MD5.
  3. Bcrypt puede configurarse para iterar más y más a medida que las CPU se vuelven más y más potentes.

Por lo tanto, usar salting-and-stretching con MD5 no es tan seguro como usar bcrypt. Este problema se puede resolver seleccionando una función hash mejor que MD5.

Por ejemplo, si se selecciona SHA-256, el tamaño de salida será de 256 bits (32 bytes). Si la salazón y estiramiento se puede configurar para aumentar el número de iteraciones, como bcrypt, no hay diferencia entre ambos métodos, excepto la cantidad de espacio requerido para almacenar hashes de resultados.

+0

Si tiene una contraseña pre-hash (factor de trabajo 12) con bcrypt, y aumenta el factor de trabajo a 14, ¿tiene que restablecer la contraseña? o bien, puede bifurcar el hash de nuevo una contraseña hash dado que el factor de trabajo es conocido –

+0

OK, olvídate de MD5, ese no es el punto de mi pregunta. Supongamos un hash arbitrario en mi programa de ejemplo que es tan largo como el resultado de bcrypt. El punto 1 es eliminado. El punto 3 también se elimina, ya que mi muestra anterior solo resuelve eso (hashing repetido para alargar el tiempo de la CPU). El punto 2 permanece: Suponiendo un mejor hash, ¿qué hace mejor a bcrypt? –

+0

@luke Nada si puede configurar el número de iteraciones de su salazón y estiramiento – JVerstry

1

Está hablando efectivamente sobre la implementación de PBKDF2 o la función de derivación de clave basada en contraseña. Efectivamente es lo mismo que BCrypt, la ventaja es que puede alargar la cantidad de tiempo de CPU que se necesita para derivar una contraseña. La ventaja de esto sobre algo como BCrypt es que, al saber cuántas "iteraciones" ha introducido la contraseña, cuando necesita aumentarla puede hacerlo sin restablecer todas las contraseñas en la base de datos. Simplemente haga que su algoritmo recoja el resultado final como si fuera la enésima iteración (donde n es el recuento de iteración anterior) ¡y continúe!

Se recomienda utilizar una biblioteca PBKDF2 adecuada en lugar de crear la suya propia, porque admitámoslo, como con todas las criptografías, la única manera de saber si algo es seguro es si ha sido 'probado' por las interwebs. (Ver here)

Los sistemas que utilizan este método:
.NET tiene una biblioteca ya implementada. Véalo here
El cifrado de archivos Mac, Linux y Windows utiliza muchas versiones de optimización (10.000+) de este método de cifrado para proteger sus sistemas de archivos.
redes Wi-Fi a menudo se fijan con este método de cifrado
Source

Gracias por la pregunta, que me obligó a investigar el método que utilizaba para sujetar mis contraseñas.

TTD

4

La principal diferencia: MD5 y otras funciones hash diseñadas para verificar los datos han sido diseñadas para ser rápidas, y bcrypt() ha sido diseñado para ser lento.

Cuando está verificando datos, desea la velocidad, porque desea verificar los datos lo más rápido posible.

Cuando intenta proteger las credenciales, la velocidad funciona en su contra. Un atacante con una copia de un hash de contraseña podrá ejecutar muchos más ataques de fuerza bruta porque MD5 y SHA1, etc., son baratos de ejecutar.

bcrypt en contraste es deliberadamente costoso. Esto importa poco cuando el usuario original autentica uno o dos intentos, pero es mucho más costoso que la fuerza bruta.

0

Estrictamente hablando, bcrypt realidad encripta el texto:

OrpheanBeholderScryDoubt

64 veces.

Pero lo hace con una clave derivada de su contraseña y una sal generada al azar.

1

Aunque esta pregunta ya está respondida, me gustaría señalar una sutil diferencia entre BCrypt y su hashing-loop. Ignoraré el algoritmo MD5 obsoleto y el factor de costo exponencial, porque podría mejorar esto fácilmente en su pregunta.

Está calculando un valor hash y luego usa el resultado para calcular el siguiente valor hash. Si observa la implementación de BCrypt, puede ver que cada iteración usa el valor hash resultante, así como la contraseña (clave) original.

Eksblowfish(cost, salt, key) 
    state = InitState() 
    state = ExpandKey(state, salt, key) 
    repeat (2^cost) 
    state = ExpandKey(state, 0, key) 
    state = ExpandKey(state, 0, salt) 
    return state 

Esta es la razón, no se puede tener una contraseña hash-Bcrypt y continuar con la iteración, ya que tendría que saber la contraseña original a continuación. No puedo probarlo, pero supongo que esto hace que Bcrypt sea más seguro que un simple hashing-loop.

Cuestiones relacionadas