`
hfhwan
  • 浏览: 73428 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

springsecurity 中的md5 + salt 加密

阅读更多
    <s:authentication-provider user-service-ref="userDetailsService">
<!-- 可设置hash使用sha1或md5散列密码后再存入数据库 -->
<s:password-encoder hash="md5" >
    <s:salt-source user-property="username"/>
</s:password-encoder>
    </s:authentication-provider>

这里设置成username为salt,进行md5加密。

那么在用户注册的时候应该把密码进行加密。可以用Md5PasswordEncoder这个类,是springsecurity内置的一个类。
    Md5PasswordEncoder md5 = new Md5PasswordEncoder();
    System.out.println( md5.encodePassword("admin", "admin"));

其中encodePassword()函数的第一个参数是密码,第二个参数是salt值。

那么encodePassword()函数是怎么样吧rawPass和salt值结合起来的呢?
找了一下源代码发现
protected String mergePasswordAndSalt(String password, Object salt, boolean strict) {
        if (password == null) {
            password = "";
        }

        if (strict && (salt != null)) {
            if ((salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1)) {
                throw new IllegalArgumentException("Cannot use { or } in salt.toString()");
            }
        }

        if ((salt == null) || "".equals(salt)) {
            return password;
        } else {
            return password + "{" + salt.toString() + "}";
        }
    }

在调用此函数时,也就是返回 rawPass{salt}。Md5PasswordEncoder是将strict参数设置为false。那么就不会检查salt值中是否含有 '{' 和 '}' 。我试了一下,如果salt中含有大括号的话,加密过后的密封是无法使用的。就是说用户虽然注册了,但是无法登陆。(这个可能和加密算法有关?)

版本:2.0.5
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics