在 Spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字符串,再加上用户名,最后算出来的md5值就没那么容易猜出来了。因为攻击者不知道盐值的值,也很难反算出密码原文。"
呵呵, 问题如何理解这句话: "先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算". 例如, 在 applicationContext-security.xml 文件中的配置如下:
view plaincopy to clipboardprint?
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="md5">
<!-- 将每个用户的username作为盐值 -->
<salt-source user-property="username"/>
</password-encoder>
</authentication-provider>
<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 通过如下方式来匹配在数据库中已经被盐值加密的密码: view plaincopy to clipboardprint?
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() + "}";
}
}
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
参考实例:http://www.lsoba.com
分享到:
相关推荐
在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中各个核心过滤器的作用和工作原理,如`HttpSessionContextIntegrationFilter`、`LogoutFilter`等。 - **第10章:管理会话** - **添加监听器:** 使用监听器来监控...
- 描述如何将配置的过滤器和命名空间应用到实际项目中,构建一个完整的Spring Security安全体系。 - **1.4 运行示例** - 提供一个具体的示例,演示如何运行配置好的Spring Security项目。 **2. 使用数据库管理...
- **与Spring框架的高度集成**:作为Spring的子项目,Spring Security能够无缝地与Spring框架中的其他组件协同工作。 - **灵活性**:Spring Security提供了高度可定制化的配置选项,允许开发者根据具体需求调整...
**:探讨盐值在密码加密中的作用。 - **配置salted密码**:提供具体的配置指南。 - **增强修改密码功能**:说明如何加强密码修改的安全性。 - **配置自定义的saltsource**:介绍自定义salt源的方法。 - **将...
3. **集成简便**:Spring Security与Spring框架无缝集成,易于在现有项目中引入和使用。 二、手册内容结构组织与反馈 本手册按照由浅入深的原则,分为基础篇和保护Web篇两大模块,涵盖了从简单Hello World示例到...
- Spring Security支持在`spring-security.xml`配置文件中使用特定的命名空间简化配置过程。 - **示例代码**: 使用`<http auto-config="true">`简化HTTP安全配置。 - **1.3 完善整个项目** - 包括设置依赖、创建...
Spring Boot Security是一个强大的框架,用于在Spring Boot应用中实现安全控制。它简化了Spring Security的配置,使得开发者能够快速地为应用程序添加认证和授权功能。在这个项目中,我们将会探讨Spring Boot ...
Spring Security鼓励使用不可逆的哈希算法和加盐值来提高安全性。 10. **XML and Annotation Configuration**: 用户可以选择使用XML配置或者注解配置来设置Spring Security,3.0.1版同时支持这两种方式,提供了灵活...
- **配置过滤器**:介绍如何在Spring Security中配置基本的安全过滤器,以拦截特定的请求并进行认证或授权。 - **使用命名空间**:展示如何利用Spring Security的XML命名空间简化安全配置。 - **完善整个项目**:...
- **盐值加密**: 在密码中加入随机字符串(盐),然后进行加密,增加安全性。 - **用户信息缓存**: 缓存已验证的用户信息,提高性能。 - **获取当前用户信息**: 通过 `Authentication` 对象获取当前登录用户的信息。...
在Spring Security中最基本的配置之一是定义过滤器。为了创建一个简单的Spring Security配置,我们需要在`web.xml`中注册Spring Security提供的`Filter`。 ```xml <filter-name>springSecurityFilterChain ...
### Spring Security 3 重写MD5解决...需要注意的是,虽然这种方法解决了大小写敏感的问题,但在实际应用中还需考虑其他安全因素,如使用更安全的哈希算法(如SHA系列)以及添加盐值等措施来进一步加强密码的安全性。
- **盐值加密**:探讨使用盐值增强密码安全性的方式。 - **用户信息缓存**:通过缓存机制提高用户信息加载效率。 - **获取当前用户信息**:介绍如何获取当前登录用户的详细信息。 - **第7章 自定义访问拒绝页面*...
### Spring Security 安全权限管理手册知识点概览 #### 一、基础篇 **1. 一个简单的Hello World** - **1.1 配置过滤器** - 理解Spring Security过滤器的工作原理及其在Spring MVC上下文中的集成方式。 - 学习...
描述中提到的“Spring-Security 3.1.0 版本之后,Spring-security-crypto模块中的password包提供了更给力的加密密码的支持”,这意味着从这个版本开始,Spring Security加强了密码加密的机制。`spring-security-...