2014-09-15 4 views
8

Я использую BCryptPasswordEncoder с весной безопасности. , но проблема в том, что он генерирует другой закодированный пароль для того же ввода.Spring BCryptPasswordEncoder генерирует другой пароль для того же входа

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 

каждый раз, когда он генерирует различные выходные данные.

+0

Зачем вам нужны пароли, имеющие одинаковый хэш? – geoand

+0

Лучший ответ на этот вопрос здесь: [Как может bcrypt иметь встроенные соли?] (Https://stackoverflow.com/questions/6832445/how-can-bcrypt-have-built-in-salts) – nobar

ответ

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

Большое спасибо. У меня была такая же проблема. Это то, что я ищу. – kaluva

+0

Простой инструмент, использующий ваш код, может сэкономить время для некоторых людей: https://github.com/raags/SpringPasswordEncoder – rags

+0

Это немного противоречит тому, что имя 'passwd' в этом примере представляет * encodedPassword * (хэш код) - не * rawPassword *. – nobar

3

Это совершенно нормально, потому что BCryptPasswordEncoder использует соль для генерации пароля. Вы можете прочитать про идею «соления» пароля here и here.

Это то, что сказано в документации для encode метода

Encode сырьевая пароль. Как правило, хороший алгоритм кодирования применяет SHA-1 или более высокий хэш в сочетании с 8-байтовой или большей случайно генерируемой солью.

10

Сгенерированный пароль соленый и, следовательно, другой.

Просьба ознакомиться с документацией по методу encode(), в котором четко указано, что пароль засолен.

+0

can вы даете мне пример этого для того же пароля? – Bhavesh

+0

@Bhavesh, чего вы хотите достичь? Зачем вам нужен такой же хэш для паролей? –

+0

Я хочу выполнить простую регистрацию и регистрацию с весенней безопасностью, используя bcrpt. – Bhavesh