j'utilise BCryptPasswordEncoder avec la sécurité Spring ., mais le problème est qu'il génère un mot de passe codé différent pour la même entrée.
String password = "123456";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(password);
System.out.print(encodedPassword);
output : $2a$10$cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi
output2 : $2a$10$KEvYX9yjj0f1X3Wl8S.KPuWzSWGyGM9ubI71NOm3ZNbJcwWN6agvW
output3 : $2a$10$nCmrPtUaOLn5EI73VZ4Ouu1TmkSWDUxxD4N6A.8hPBWg43Vl.RLDC
chaque fois, il génère une sortie différente.
public static void main(String[] args) {
// spring 4.0.0
org.springframework.security.crypto.password.PasswordEncoder encoder
= new org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder();
// $2a$10$lB6/PKg2/JC4XgdMDXyjs.dLC9jFNAuuNbFkL9udcXe/EBjxSyqxW
// true
// $2a$10$KbQiHKTa1WIsQFTQWQKCiujoTJJB7MCMSaSgG/imVkKRicMPwgN5i
// true
// $2a$10$5WfW4uxVb4SIdzcTJI9U7eU4ZwaocrvP.2CKkWJkBDKz1dmCh50J2
// true
// $2a$10$0wR/6uaPxU7kGyUIsx/JS.krbAA9429fwsuCyTlEFJG54HgdR10nK
// true
// $2a$10$gfmnyiTlf8MDmwG7oqKJG.W8rrag8jt6dNW.31ukgr0.quwGujUuO
// true
for (int i = 0; i < 5; i++) {
// "123456" - plain text - user input from user interface
String passwd = encoder.encode("123456");
// passwd - password from database
System.out.println(passwd); // print hash
// true for all 5 iteration
System.out.println(encoder.matches("123456", passwd));
}
}
Les mots de passe générés sont salés et donc différents.
Veuillez lire la documentation de la méthode encode () où elle indique clairement que le mot de passe est salé.
Ceci est parfaitement normal car BCryptPasswordEncoder utilise un sel pour générer le mot de passe. Vous pouvez en savoir plus sur l'idée de "saler" un mot de passe ici et ici .
C’est ce que dit la documentation pour la méthode encode
Encoder le mot de passe brut. Généralement, un bon algorithme de codage applique un hachage SHA-1 ou supérieur, associé à un sel généré aléatoirement sur 8 octets ou plus.
Les 22 caractères directement après le 2nd $ représentent la valeur du sel, voir https://en.wikipedia.org/wiki/Bcrypt#Description . "Salt" est une donnée aléatoire ajoutée au mot de passe avant le hachage. Ainsi, un algorithme de hachage donné avec des paramètres donnés produira dans la plupart des cas des valeurs de hachage différentes pour le même mot de passe (protection contre les attaques dites Rainbow).
Disséquons le premier résultat affiché dans la question d'origine: $2a$10$cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi
$2a
: identifiant pour l'algorithme BCrypt$10
: paramètre pour le nombre de tours, ici 2 ^ 10 tourscYLM.qoXpeAzcZhJ3oXRLu
: Sel (128 bits)9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi
: valeur de hachage réelle (184 bits)Le sel et la valeur de hachage sont tous deux codés à l'aide de Radix-64.