web-dev-qa-db-fra.com

Spring BCryptPasswordEncoder génère un mot de passe différent pour la même entrée.

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. 

16
Bhavesh
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));
    }
}
19
blueberry0xff

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é.

12
Uwe Plonus

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.

4
geoand

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 tours
  • cYLM.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. 

1
user1364368