Spring Безопасность Шифрование MD5
У меня есть веб-приложение java с использованием инфраструктуры spring и spring безопасности для его входа в систему. В моей базе данных перед сохранением моих паролей, зашифрованных до MD5. Я добавил в свой код приложения-config.xml эти коды
<security:authentication-provider>
<security:password-encoder hash="md5"/>
<security:jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select user_name username, user_password password, 1 enabled from users where user_name=?"
authorities-by-username-query="select username, authority from authorities where username=?" />
</security:authentication-provider>
Сначала он работал, когда пароль в db не был зашифрован. Но когда я зашифровал его и добавил этот фрагмент в конфигурацию моего приложения
<security:password-encoder hash="md5"/>
Я не могу войти.
Ответы
Ответ 1
Как вы создаете хеши MD5? Что-то вроде следующего хорошо работает в Java:
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(user.getPassword().getBytes(),0, user.getPassword().length());
String hashedPass = new BigInteger(1,messageDigest.digest()).toString(16);
if (hashedPass.length() < 32) {
hashedPass = "0" + hashedPass;
}
Когда вы кодируете "koala", вы получаете "a564de63c2d0da68cf47586ee05984d7"?
Ответ 2
Я понимаю, что это немного поздно, но Spring имеет встроенные классы, которые делают это намного проще.
@Test
public void testSpringEncoder() {
PasswordEncoder encoder = new Md5PasswordEncoder();
String hashedPass = encoder.encodePassword("koala", null);
assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass);
}
Это unit test, который я написал с использованием встроенного кода безопасности Spring, он намного меньше кода MessageDigest, и поскольку вы используете Spring Security уже, вы должны иметь классы в своем пути к классам уже.
Ответ 3
Вы прочитали 6.3.3 Хеширование и аутентификация в разделе Spring Справочное руководство по безопасности? Он упомянул о некоторых возможных проблемах, которые могут возникнуть при использовании хеширования паролей.
Некоторые возможности, которые он перечисляет:
- Хэширование пароля базы данных может быть в Base64, а результат MD5PasswordEncoder - в шестнадцатеричных строках
- Хэш вашего пароля может быть в верхнем регистре, в то время как результат от кодера находится в строках нижнего регистра.