在 Spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字符串,再加上用户名,最后算出来的md5值就没那么容易猜出来了。因为攻击者不知道盐值的值,也很难反算出密码原文。"
呵呵, 问题如何理解这句话: "先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算". 例如, 在 applicationContext-security.xml 文件中的配置如下:
[xhtml] view plaincopy
01.<authentication-provider user-service-ref="userDetailsService">
02. <password-encoder hash="md5">
03. <!-- 将每个用户的username作为盐值 -->
04. <salt-source user-property="username"/>
05. </password-encoder>
06.</authentication-provider>
假设用户名是 Tom, 密码为 123456, 那么在数据库中存放的值应该是什么?
通过查看 Spring Security 的 org.springframework.security.providers.encoding.BasePasswordEncoder 类可知 Spring Security 通过如下方式来匹配在数据库中已经被盐值加密的密码:
[java] view plaincopy
01.protected String mergePasswordAndSalt(String password, Object salt, boolean strict) {
02. if (password == null) {
03. password = "";
04. }
05.
06. if (strict && (salt != null)) {
07. if ((salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1)) {
08. throw new IllegalArgumentException("Cannot use { or } in salt.toString()");
09. }
10. }
11.
12. if ((salt == null) || "".equals(salt)) {
13. return password;
14. } else {
15. return password + "{" + salt.toString() + "}";
16. }
17.}
即通过 password + "{" + salt.toString() + "}" 中方式把 "密码和盐值指定的内容合并在一起". 所以对于用户名是 Tom, 密码为 123456 的用户在数据库中存放的密码应该为对 "123456{Tom}" md5 验算后的值: 610c492873b994f96f93e342a56bcd68
分享到:
相关推荐
在Spring Security中,默认使用的是BCryptPasswordEncoder或者PBEWithMD5AndDES等加密算法。但为了满足特定需求,我们可以自定义密码编码器。下面是如何实现的步骤: 1. **创建自定义PasswordEncoder**:你需要创建...
在Spring Security 2.0.4这个版本中,尽管相对较老,但仍然包含了许多核心的安全概念和技术,值得我们深入探讨。 1. **身份验证**:Spring Security的核心功能之一是用户身份验证。它支持多种认证机制,包括基于...
**6.2 盐值加密** 为了进一步增强密码的安全性,可以使用盐值(salt)来增加密码的复杂性。盐值是在加密过程中添加的一个随机字符串,使得相同的密码在不同的盐值下会产生不同的哈希结果。 **6.3 用户信息缓存** ...
`BCryptPasswordEncoder`是Spring Security提供的强大工具,它自动化了盐值处理,为应用程序提供了更高级别的安全性。在实际开发中,应遵循最佳实践,使用`BCryptPasswordEncoder`对用户密码进行加密,以保护用户的...
- 描述如何将配置的过滤器和命名空间应用到实际项目中,构建一个完整的Spring Security安全体系。 - **1.4 运行示例** - 提供一个具体的示例,演示如何运行配置好的Spring Security项目。 **2. 使用数据库管理...
- **过滤器解析:** 详细介绍Spring Security中各个核心过滤器的作用和工作原理,如`HttpSessionContextIntegrationFilter`、`LogoutFilter`等。 - **第10章:管理会话** - **添加监听器:** 使用监听器来监控...
- **与Spring框架的高度集成**:作为Spring的子项目,Spring Security能够无缝地与Spring框架中的其他组件协同工作。 - **灵活性**:Spring Security提供了高度可定制化的配置选项,允许开发者根据具体需求调整...
**:探讨盐值在密码加密中的作用。 - **配置salted密码**:提供具体的配置指南。 - **增强修改密码功能**:说明如何加强密码修改的安全性。 - **配置自定义的saltsource**:介绍自定义salt源的方法。 - **将...
- Spring Security支持在`spring-security.xml`配置文件中使用特定的命名空间简化配置过程。 - **示例代码**: 使用`<http auto-config="true">`简化HTTP安全配置。 - **1.3 完善整个项目** - 包括设置依赖、创建...
Spring Security鼓励使用不可逆的哈希算法和加盐值来提高安全性。 10. **XML and Annotation Configuration**: 用户可以选择使用XML配置或者注解配置来设置Spring Security,3.0.1版同时支持这两种方式,提供了灵活...
6. **Passwords**:Spring Boot Security也提供了一套工具来处理密码,包括哈希和盐值的生成,以及密码的加密。 在项目开发过程中,理解并掌握这些核心组件将帮助我们构建一个健壮且安全的Spring Boot应用。通过对...
- **配置过滤器**:介绍如何在Spring Security中配置基本的安全过滤器,以拦截特定的请求并进行认证或授权。 - **使用命名空间**:展示如何利用Spring Security的XML命名空间简化安全配置。 - **完善整个项目**:...
在Spring Security中最基本的配置之一是定义过滤器。为了创建一个简单的Spring Security配置,我们需要在`web.xml`中注册Spring Security提供的`Filter`。 ```xml <filter-name>springSecurityFilterChain ...
### Spring Security 3 重写MD5解决...需要注意的是,虽然这种方法解决了大小写敏感的问题,但在实际应用中还需考虑其他安全因素,如使用更安全的哈希算法(如SHA系列)以及添加盐值等措施来进一步加强密码的安全性。
- **盐值加密**: 在密码中加入随机字符串(盐),然后进行加密,增加安全性。 - **用户信息缓存**: 缓存已验证的用户信息,提高性能。 - **获取当前用户信息**: 通过 `Authentication` 对象获取当前登录用户的信息。...
- **盐值加密**:探讨使用盐值增强密码安全性的方式。 - **用户信息缓存**:通过缓存机制提高用户信息加载效率。 - **获取当前用户信息**:介绍如何获取当前登录用户的详细信息。 - **第7章 自定义访问拒绝页面*...
描述中提到的“Spring-Security 3.1.0 版本之后,Spring-security-crypto模块中的password包提供了更给力的加密密码的支持”,这意味着从这个版本开始,Spring Security加强了密码加密的机制。`spring-security-...