2015-05-10 5 views
2

Я использую Spring Security для обработки авторизации в своем приложении. В моей конфигурации у меня есть следующий:Spring Security - хеширование паролей

<security:authentication-manager> 
    <security:authentication-provider> 
     <security:password-encoder hash="md5"/> 
     <security:jdbc-user-service id="userService" 
        data-source-ref="dataSource" 
        users-by-username-query="select phone, password, true from users where phone=?" 
        authorities-by-username-query="select phone,'ROLE_USER' from users where phone=?" /> 
    </security:authentication-provider> 
</security:authentication-manager> 

Когда я удалить <security:password-encoder hash="md5"/> линии и хранить в БД сырого пароль, авторизация работает отлично. Но когда я пытаюсь хранить в БД хэшированные пароли и использую эту строку, авторизация завершается с ошибкой. Я делаю что-то неправильно?

P.S. Хэш пароля в БД на 100% правильный. 202cb962ac59075b964b07152d234b70 для 123 пароль.

+0

ли вы хэш введенный пароль, если пароли БД хэшируются? –

+0

Нет, я думал, поэтому мне нужно использовать , это неправильно? –

+0

Как вы сравниваете введенный пароль с именем в базе данных? Обновите свой вопрос кодом. –

ответ

2

Я могу предложить вам создать тестовый класс и создать хэш.

import org.springframework.security.authentication.encoding.Md5PasswordEncoder; 

    public class Test { 
     public static void main(String[] args) { 
      Md5PasswordEncoder encoderMD5 = new Md5PasswordEncoder(); 
      String securePass = encoderMD5.encodePassword("admin", null); 
      System.out.println(encoderMD5.isPasswordValid(securePass,"admin", null)); 
     } 
    } 

При использовании XML

<bean name="md5" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/> 

<security:password-encoder ref="md5"/> 

И, конечно, проверить хэш-значение пароля в базе данных

От меня рекомендуют использовать Bcrypt

В XML

<bean name="bcryptEncode" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> 
     <constructor-arg value="12"></constructor-arg> 
</bean> 

<security:password-encoder ref="bcryptEncode"/> 

закодированные пароль, который вы можете получить так:

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 
import org.springframework.security.crypto.password.PasswordEncoder; 

public class PrintBCryptString { 
    public static void main(String[] args) { 
     PasswordEncoder encoder = new BCryptPasswordEncoder(12); 
     System.out.println(encoder.matches("type here some string", encoder.encode("type here some string"))); 
     System.out.println(encoder.encode("type here some string")); 
    } 
} 

Возможно будет полезно небольшой explanation of bcrypt

+0

Я не пользуюсь солью в своем приложении, поэтому я попытался использовать «» и null как соль в этом тесте. Оба случая были успешными, поэтому я думаю, что проблема заключается не в неправильном хешировании. Да, я знаю, что bcrypt намного лучше, чем md5, но по некоторым причинам мне нужно использовать только md5. –

+0

@ gth99 поделиться, пожалуйста, ваши пользователи таблицы db –

Смежные вопросы