Spring Security加密MD5

时间:2009-11-30 17:04:46

标签: passwords spring-security encryption

我有一个使用spring框架和spring安全性的java Web应用程序进行登录。在我的数据库中,我在保存之前将我的密码加密到MD5。我在application-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"/>

我无法登录。

3 个答案:

答案 0 :(得分:47)

我意识到这有点晚了,但Spring有内置的类,这使得这更容易。

@Test
public void testSpringEncoder() {
    PasswordEncoder encoder = new Md5PasswordEncoder();
    String hashedPass = encoder.encodePassword("koala", null);

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass);
}

这是我使用内置Spring Security代码编写的单元测试,它比MessageDigest代码小很多,并且由于您已经使用了Spring Security,因此您应该已经在类路径中使用了类。

答案 1 :(得分:6)

你是如何创建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 :(得分:5)

您是否阅读过Spring Security参考手册中的6.3.3 Hashing and Authentication部分?它提到了使用密码散列时可能遇到的一些问题。

它列出的一些可能性:

  • 数据库密码哈希可能在Base64中,而MD5PasswordEncoder的结果是十六进制字符串
  • 您的密码哈希值可能为大写,而编码器的结果为小写字符串