2014-09-15 12 views
8

sto utilizzando BCryptPasswordEncoder con Spring Security. ma il problema è che la sua generazione di password codificata diversa per lo stesso input.Spring BCryptPasswordEncoder genera password diverse per lo stesso input

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 

ogni volta che genera un output diverso.

+0

Perché è necessario che le password abbiano lo stesso hash? – geoand

+0

La migliore risposta a questa domanda è qui: [Come può bcrypt avere i sali incorporati?] (Https://stackoverflow.com/questions/6832445/how-can-bcrypt-have-built-in-salts) – nobar

risposta

11
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)); 
    } 
} 
+1

Grazie mille. Stavo avendo lo stesso problema. Questo è quello che sto cercando. – kaluva

+0

Creato un semplice strumento usando il tuo codice, potrebbe risparmiare tempo per alcune persone: https://github.com/raags/SpringPasswordEncoder – rags

+0

È un po 'controintuitivo che il nome "passwd" in questo esempio rappresenta la * codificaPassword * (l'hash codice) - non * rawPassword *. – nobar

3

Questo è perfettamente normale perché BCryptPasswordEncoder utilizza un salt per generare la password. Puoi leggere l'idea alla base di "salting" di una password here e here.

Questo è ciò che dice la documentazione per il metodo encode

Encode la password crudo. Generalmente, un buon algoritmo di codifica applica un hash SHA-1 o maggiore combinato con un sale generato a caso a 8 o più byte.

10

La password generata è salata e quindi diversa.

Leggere la documentazione per il metodo encode() dove indica chiaramente che la password è salata.

+0

può me ne dai un esempio per la stessa password? – Bhavesh

+0

@Bhavesh cosa vuoi ottenere? Perché hai bisogno dello stesso hash per le password? –

+0

Voglio eseguire semplici operazioni di login e registrazione con sicurezza di primavera usando bcrpt. – Bhavesh

Problemi correlati