¿Usando 512-hash antes de Bcrypt?

Quiero usar Bcrypt para el cifrado de contraseñas en mis sistemas. Pero todos los ejemplos son algo como esto:

$password = $_POST['password'];
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
$hash = crypt($password, '$2a$12$'.$salt);

Esto me parece bastante seguro, pero me preguntaba, en cada ejemplo, nadie codifica la contraseña antes de usar Bcrypt.

Debido a la sal única, las tablas Rainbow no deberían poder descifrar todas las contraseñas a la vez. Pero en caso de que el hacker tome un registro y cree una tabla de arcoíris con la sal de ese registro en particular, debería poder descifrar una contraseña débil.

Entonces, si alguien toma una contraseña débil (digamos 'foo'), sería más seguro codificarla primero con SHA-512 antes de usar Bcrypt. ¿Tengo razón? ¿O esto solo parece más seguro?

preguntado el 30 de junio de 12 a las 18:06

Crear una tabla de arco iris solo para un solo hash no tiene sentido. -

4 Respuestas

En realidad, la respuesta tiene que ser no, no hace que el hash sea más fuerte en un sentido criptográfico. Como probablemente sepa, bcrypt (aunque la función a usar se llama crypt) es una función hash en sí misma, no una función de cifrado.

En bcrypt, pasa un factor de costo, que define cuántas iteraciones se realizarán (normalmente cientos de ellas). Ese ralentiza cálculo del hash, lo que hace impracticables los ataques de fuerza bruta. Usar SHA-512 antes, solo agregará una iteración más.

Lo que dijiste sobre el sal es correcto, pero, por supuesto, si tiene que crear una tabla de arcoíris para cada contraseña, simplemente usará la fuerza bruta hasta que encuentre una coincidencia, sin necesidad de crear toda la tabla de arcoíris.

Si el atacante tiene control sobre base de datos y codigo, un SHA-512 adicional no ayudará en nada (solo una iteración más). Si solo tiene el base de datos sin codigo (SQL-Injection), entonces reconocerá el hash bcrypt. Ahora puede utilizar la fuerza bruta con bcrypt, pero gracias al SHA-512 no hay contraseñas débiles. Es como si el hash SHA-512 fuera la contraseña para descifrar, por lo que un diccionario no sirve de nada. Esto es seguridad por oscuridad, pero será efectivo mientras no se conozca el código. Puede obtener el mismo efecto más fácilmente agregando una sal codificada fija (clave), antes de usar bcrypt con la sal única.

Respondido el 30 de junio de 12 a las 21:06

Sí, cuando el atacante tiene la base de datos y el código, no tiene sentido. Pero en caso de que el atacante solo tenga la base de datos, tratar la contraseña (con un hash o sal o lo que sea) hace que el sistema sea más seguro, porque ya no hay contraseñas débiles. ¡Gracias por ayudarme! Creo que voy a usar una sal codificada para proteger las contraseñas débiles de mis usuarios;) - VIDNA

crypt() es un hash de cadena unidireccional, no un mecanismo de cifrado. Para usar un hash SHA-512, debe usar el hash() función. Bcrypt requiere una extensión de PHP. Para almacenar contraseñas, ¿por qué quiere hacerlas reversibles, en lugar de simplemente codificarlas? Eso es menos seguro: si alguien obtiene su clave y base de datos, tiene todas las contraseñas, pero una tabla de hashes SHA512 es bastante inútil.

Respondido el 30 de junio de 12 a las 19:06

llamar crypt() con '$2a' como parámetro, en realidad calculará un hash bcrypt. Bcrypt en sí es una función hash, Vidna no quería cifrar la contraseña. - martinstoeckli

Hashing primero no ayudará. Una contraseña incorrecta es aquella que un atacante considera más probable y la coloca antes en su lista de contraseñas para probar.

Bcrypt incorpora sal para eliminar tablas de búsqueda precalculadas (un Rainbow Table es un ejemplo). ¿Por qué un atacante construiría una tabla de arcoíris para un solo registro? No, cuando ataca una contraseña salada, un atacante simplemente revisa su lista ordenada de contraseñas más probables, repitiendo el algoritmo hash para ver si coincide.

Hasta dónde puede trabajar en esa lista depende de cuánto tiempo tarde en ejecutarse el algoritmo hash. Bcrypt controla eso con el factor de "costo": 12 en su ejemplo (que está bien, pero probablemente sea el mínimo que usaría). Una ronda extra de SHA-512 no agrega nada a eso. Ya está realizando 4096 costosas iteraciones de bcrypt. Agregar 1 iteración SHA-512 barata es insignificante.

Si elige la primera contraseña de la lista, se romperá en una fracción de segundo. Si elige la milmillonésima contraseña, el atacante no la descifrará durante algunas décadas.

Respondido el 30 de junio de 12 a las 20:06

bcrypt ya usa salt, y lo que está haciendo internamente es bastante más fuerte que SHA512. Agregar una iteración de SHA512 (y/o una capa extra de sal) encima de bcrypt no le dará un resultado significativamente más fuerte. Si las dos funciones interactúan de manera incorrecta, combinarlas de esta manera puede dar como resultado una función hash más débil.

Respondido el 30 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.