¿Necesito almacenar la sal con bcrypt?

189

El javadoc de bCrypt tiene este código para encriptar una contraseña:

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

Para verificar si una contraseña de texto sin formato coincide con una que se ha cifrado previamente, use el método checkpw:

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

Estos fragmentos de código implican para mí que la sal generada al azar se tira a la basura. ¿Es este el caso, o es solo un fragmento de código engañoso?

RodeoPayaso
fuente

Respuestas:

214

La sal se incorpora al hash (codificado en un formato de estilo base64).

Por ejemplo, en las contraseñas tradicionales de Unix, la sal se almacenaba como los dos primeros caracteres de la contraseña. Los caracteres restantes representaban el valor hash. La función de verificación lo sabe y separa el hash para recuperar la sal.

Greg Hewgill
fuente
59
La sal está incorporada en la contraseña. Entonces no tienes que guardar la sal.
Swapnonil Mukherjee
2
Gracias por eso. Desearía que dijeran eso en el javadoc :) (He buscado en la fuente y confirmado, pero no sabía lo que estaba buscando antes)
RodeoClown
1
Gracias. ¡Estaba tratando de resolver esto también! Ahora me pregunto si es una buena idea. ¿Hay alguna ventaja / desventaja en mantener la sal en el hash en lugar de almacenarla por separado?
Adam
8
@ Adam - Como la sal se genera aleatoriamente, significa que no necesita tener un método para asociar las dos cosas en su base de datos.
RodeoClown
Eché un vistazo al código fuente y descubrí que aunque el JavaDoc para el argumento de la sal "tal vez se genera usando BCrypt.gensalt", descubrí que tienes que usar el método genSalt () o obtienes excepciones = /
the_new_mr