zoukankan      html  css  js  c++  java
  • Spring Security中的MD5盐值加密

    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

  • 相关阅读:
    newgrp
    netstat
    netlink, PF_NETLINK
    netdevice
    mv
    mplayer
    mpg123
    MOVE
    motd
    more
  • 原文地址:https://www.cnblogs.com/zhxn/p/7093387.html
Copyright © 2011-2022 走看看