2014-09-15 11 views
8

Używam BCryptPasswordEncoder z ochroną Spring. , ale problem polega na tym, że generuje on inne zakodowane hasło dla tego samego wejścia.Spring BCryptPasswordEncoder generuje inne hasło dla tego samego wejścia

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 

za każdym razem jego generowanie różnych wyników.

+0

Dlaczego hasła muszą mieć ten sam skrót? – geoand

+0

Najlepsza odpowiedź na to pytanie jest tutaj: [W jaki sposób bcrypt ma wbudowane sole?] (Https://stackoverflow.com/questions/6832445/how-can-bcrypt-have-built-in-salts) – nobar

Odpowiedz

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

Wielkie dzięki. Miałem ten sam problem. Tego właśnie szukam. – kaluva

+0

Wykonanie prostego narzędzia za pomocą kodu, może zaoszczędzić trochę czasu dla niektórych osób: https://github.com/raags/SpringPasswordEncoder – rags

+0

To jest trochę sprzeczne z intuicją, że nazwa 'passwd' w tym przykładzie reprezentuje * zakodowane hasło * (hash kod) - nie * rawPassword *. – nobar

3

Jest to całkowicie normalne, ponieważ BCryptPasswordEncoder używa soli do wygenerowania hasła. Możesz przeczytać o idei "solenia" hasła here i here.

To właśnie dokumentacja mówi o sposobie encode

zakodować surowy hasło. Ogólnie rzecz biorąc, dobry algorytm kodowania stosuje SHA-1 lub wyższy hash połączony z 8-bajtową lub większą losowo generowaną solą.

10

Wygenerowane hasło jest solone, a przez to inne.

Należy przeczytać dokumentację metody encode(), w której wyraźnie stwierdza się, że hasło jest solone.

+0

może dasz mi przykład tego samego hasła? – Bhavesh

+0

@Bhavesh co chcesz osiągnąć? Dlaczego potrzebujesz tego samego hasha dla haseł? –

+0

Chcę przeprowadzić prostą operację logowania i rejestracji z bezpieczeństwem sprężynowym za pomocą bcrpt. – Bhavesh

Powiązane problemy