Spring Security中的MD5盐值加密

摘要:
在springSecurity文档中有这么一句话:"盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字符串,再加上用户名,最后算出来的md5值就没那么容易猜出来了。--将每个用户的username作为盐值--˃假设用户名是Tom,密码为123456,那么在数据库中存放的值应该是什么?通过查看SpringSecurity的org.springframework.security.providers.encoding.BasePasswordEncoder类可知SpringSecurity通过如下方式来匹配在数据库中已经被盐值加密的密码:protectedStringmergePasswordAndSalt{if{password="";}if(strict&&(salt!

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

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

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

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

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

protectedStringmergePasswordAndSalt(Stringpassword,Objectsalt,booleanstrict){
if(password==null){
password="";
}
if(strict&&(salt!=null)){
if((salt.toString().lastIndexOf("{")!=-1)||(salt.toString().lastIndexOf("}")!=-1)){
thrownewIllegalArgumentException("Cannotuse{or}insalt.toString()");
}
}
if((salt==null)||"".equals(salt)){
returnpassword;
}else{
returnpassword+"{"+salt.toString()+"}";
}
}

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

免责声明:文章转载自《Spring Security中的MD5盐值加密》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇几个容器网络相关问题的分析和解决总结[转]VR原理讲解及开发入门下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MD5 加盐加密

一、概述   MD5(Message Digest  Algorithm 5),是一种散列算法,是不可逆的,即通过md5加密之后没办法得到原文,没有解密算法。   在一般的项目中都会有登录注册功能,最简单的,登录注册过程完全没有加密,存储在数据库的密码也是明文,安全性是很差的,万一数据泄露就不好了(表一)。所以,通过MD5将密码加密后保存在数据库中(表二)...

C#MD5算法

1.来历 MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来, 经md2、md3和md4发展而来。http://www.ietf.org/rfc/rfc1...

.NET Core MD5加密 32位和16位

public class MD5Help {   //此代码示例通过创建哈希字符串适用于任何 MD5 哈希函数 (在任何平台) 上创建 32 个字符的十六进制格式哈希字符串官网案例改编   /// <summary>   ///获取32位md5加密   /// </summary>   /// <param nam...

MD5加密解密以及设置salt(盐值)

MD5算法 package com.oracle.jsp.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * * @author wjxing * */ public class MD5 {...

python -第七节课之加密操作之md5加密和base64类型

常用的加密方式就是md5加密 实际场景:用户管理数据存到数据库,注册的时候账号和密码不能存成铭文要转成加密的形式 python使用的模块hashlib 举例子 import hashlibs='cdsdsa's=s.encode()#字符串转成bytes类型m=hashlib.md5(s)#md5方法必须传一个bytes类型res=m.hexdigest(...

java(计算机)常见加密算法详解

  来源:http://blog.csdn.net/janronehoo/article/category/1152295  如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMA...