Dois-je stocker le sel avec bcrypt?

189

Le javadoc de bCrypt a ce code pour crypter un mot de passe:

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

Pour vérifier si un mot de passe en texte brut correspond à celui qui a été haché précédemment, utilisez la méthode checkpw:

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

Ces extraits de code impliquent pour moi que le sel généré aléatoirement est jeté. Est-ce le cas ou s'agit-il simplement d'un extrait de code trompeur?

RodéoClown
la source

Réponses:

214

Le sel est incorporé dans le hachage (codé dans un format de style base64).

Par exemple, dans les mots de passe Unix traditionnels, le sel était stocké comme les deux premiers caractères du mot de passe. Les caractères restants représentaient la valeur de hachage. La fonction de vérification le sait et sépare le hachage pour récupérer le sel.

Greg Hewgill
la source
59
Le sel EST incorporé dans le mot de passe. Vous n'avez donc pas besoin de conserver le sel.
Swapnonil Mukherjee
2
Merci pour ça. J'aurais aimé qu'ils disent ça dans le javadoc :) (J'ai regardé la source et confirmé - mais je ne savais pas ce que je cherchais avant)
RodeoClown
1
Merci - J'essayais de comprendre cela aussi! Maintenant, je me demande si c'est une bonne idée. Y a-t-il un avantage / un inconvénient à conserver le sel dans le hachage par rapport à le stocker séparément?
Adam le
8
@Adam - Comme le sel est généré aléatoirement, cela signifie que vous n'avez pas besoin d'avoir une méthode pour associer les deux choses dans votre base de données.
RodeoClown
J'ai jeté un coup d'œil au code source et j'ai découvert que bien que le JavaDoc pour l'argument salt soit "peut-être généré en utilisant BCrypt.gensalt", j'ai trouvé que vous devez utiliser la méthode genSalt () ou que vous obtenez des exceptions = /
the_new_mr