spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字符串,再加上用户名,最后算出来的md5值就没那么容易猜出来了。因为攻击者不知道盐值的值,也很难反算出密码原文。"

问题如何理解这句话: "先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算".  例如, 在 applicationContext-security.xml 文件中的配置如下:

<authentication-provider user-service-ref="userDetailsService">     
     <password-encoder hash="md5">  
         <!-- 将每个用户的username作为盐值 -->  
         <salt-source user-property="username"/>  
     </password-encoder>  
</authentication-provider>  

假设用户名是 Tom, 密码为 123456, 那么在数据库中存放的值应该是什么?

通过查看 Spring Security 的 org.springframework.security.providers.encoding.BasePasswordEncoder 类可知 Spring Security 通过如下方式来匹配在数据库中已经被盐值加密的密码:

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() + "}";  
        }  
}  

即通过 password + "{" + salt.toString() + "}" 中方式把 "密码和盐值指定的内容合并在一起". 所以对于用户名是 Tom, 密码为 123456 的用户在数据库中存放的密码应该为对 "123456{Tom}" md5 验算后的值: 610c492873b994f96f93e342a56bcd68

最新文章

  1. java中Integer,String判断相等与integer的比较大小
  2. html入门问题_2016-10-29
  3. Spring、struts、webwork2三者MVC的比较
  4. js在以div添加滚动条
  5. D3.js:交互式操作
  6. Windows远程桌面卡的解决办法
  7. Luogu P1877 [HAOI2012]音量调节
  8. Android 音视频编解码——RGB与YUV格式转换
  9. centos下安装nginx并部署angular应用
  10. Web从入门到放弃&lt;4&gt;
  11. 如何根据checkbox的值进行勾选!例:我要勾选value等于scanbuy,terminal的复选框!
  12. JavaScript基础整理
  13. JAVA代码中可使用中文类名,变量名,对象名,方法名.
  14. LSTM学习—Long Short Term Memory networks
  15. python 4
  16. packetfence 7.2网络准入部署(二)
  17. 判断一个点在多边形的内部C++
  18. hbase 学习(十五)缓存机制以及可以利用SSD作为存储的BucketCache
  19. IE8下部分方法失效的解决方法
  20. Python笔记 #07# NumPy 文档地址 &amp; Subsetting 2D Arrays

热门文章

  1. Ubuntu启动流程
  2. ie7 text-indent input影响
  3. html 页面刷新
  4. muduo库源码剖析(二) 服务端
  5. Android接口和框架学习
  6. hdu 4603 Color the Tree
  7. 0x31 质数
  8. hdoj--3367--Pseudoforest(伪森林&amp;&amp;最大生成树)
  9. 敏捷开发 —— TDD(测试驱动开发)
  10. 从git源码安装zabbix-agent