Muss ich das Salz mit bcrypt aufbewahren?

189

Javadoc von bCrypt enthält den folgenden Code zum Verschlüsseln eines Kennworts:

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

Verwenden Sie die checkpw-Methode, um zu überprüfen, ob ein Klartextkennwort mit einem zuvor gehashten übereinstimmt.

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

Diese Codefragmente implizieren für mich, dass das zufällig erzeugte Salz weggeworfen wird. Ist dies der Fall oder handelt es sich nur um einen irreführenden Code-Ausschnitt?

RodeoClown
quelle

Antworten:

214

Das Salz wird in den Hash eingearbeitet (in einem Base64-Format codiert).

In herkömmlichen Unix-Passwörtern wurde das Salt beispielsweise als die ersten beiden Zeichen des Passworts gespeichert. Die restlichen Zeichen repräsentieren den Hashwert. Die Checker-Funktion weiß das und zieht den Hash auseinander, um das Salz wieder herauszuholen.

Greg Hewgill
quelle
59
Das Salz ist im Passwort enthalten. Sie müssen also nicht das Salz sparen.
Swapnonil Mukherjee
2
Dank dafür. Ich wünschte, sie hätten das im Javadoc gesagt :) (Ich habe mir die Quelle angesehen und bestätigt - aber ich wusste nicht, wonach ich vorher gesucht habe)
RodeoClown
1
Danke - ich habe auch versucht, das herauszufinden! Jetzt frage ich mich, ob das eine gute Idee ist. Gibt es einen Vor- / Nachteil, wenn das Salz im Hash bleibt, anstatt es separat zu lagern?
Adam
8
@Adam - Da das Salz zufällig generiert wird, benötigen Sie keine Methode, um die beiden Dinge in Ihrer Datenbank zu verknüpfen.
RodeoClown
Ich habe mir den Quellcode angesehen und festgestellt, dass JavaDoc für das Salt-Argument zwar "möglicherweise mit BCrypt.gensalt generiert" wurde, ich jedoch die genSalt () -Methode verwenden muss oder Ausnahmen = /
the_new_mr