- 浏览: 452373 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:383297
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
bbjavaeye 写道你好,有个问题请教一下我配了<b ...
《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService) -
bay0902:
中国互联网的脊梁
Spring Security 3全文下载 -
hdcustc:
项目源码下载 微博网盘里的那个依赖文件损坏了啊 能否提供个可 ...
Spring Security 3全文下载 -
i641878506:
楼主辛苦, 可以提供原书的原项目文件的下载么
Spring Security 3全文下载
配置安全的密码
我们回忆第一章:一个不安全应用的剖析中,审计人员认为密码以明文形式进行存储是最高优先级的安全风险。实际上,在任何安全系统中,密码安全都是保证已经经过认证的安全实体是真实可靠的重要方面。安全系统的设计人员必须保证密码存储时,任何恶意的用户想要进行破解都是非常困难的。
在数据库存储时,需要遵守以下的准则:
l 密码不能以明文的形式进行存储(简单文本);
l 用户提供的密码必须与数据库存储的密码进行比较;
l 密码不能应用户的请求提供(即使用户忘记了密码)。
对于大多数应用来说,为了满足以上要求最适合的方式是对密码进行单向的编码或加密。单向编码提供了安全和唯一的特性,这对于正确的认证用户非常重要,它能够保证密码一旦被加密就不能再被解密了。
在大多数的安全应用设计中,一般没有必要和实际要求根据用户的请求检索用户的密码,因为如果没有附加的安全认证,提供用户的实际密码会有很大的安全风险。作为替代方案,大多数的应用为用户提供了重设密码的功能,要么需要提供额外的认证信息(如社会保险号码、生日、缴税ID或其它个人信息),要么通过一个基于email的系统。
【存储其它类型的敏感信息:以下的准则可以应用于密码以及其它类型的敏感信息,包括社会保险号以及信用卡信息(尽管基于应用的不同,它们中的一些需要解密的能力)。比较常见的是数据库以多种形式来存储这些敏感信息,比如用户16个数字的信用卡数字可以用一种高度加密的形式存储,但是最后的四位数字以明文的形式存储(作为佐证,可以回忆一些商业站点会显示XXXX XXXX XXXX 1234来帮助你分别已存储的信用卡)。】
基于我们(实际上并不太符合现实)使用SQL来访问HSQL数据库中用户的环境,你可能已经在思考如何对密码进行编码。HSQL以及其它大多数的数据库并没有提供加密方法作为数据库的内置功能。
一般来说,bootstrap过程(为系统添加初始的用户和数据)会联合使用一些SQL加载和Java代码。根据应用的复杂性,这个过程也可能会变得很复杂。
对于JBCP Pets应用来说,我们将会继续使用嵌入式数据库声明和对应的SQL,并且会添加一点Java代码在初始化加载后执行来加密数据库中的所有密码。为了使得密码加密能够正常工作,两个过程必须同步的使用密码加密以确保密码能够被一致的处理和校验。
在Spring Security中,密码加密已经进行了封装,通过o.s.s.authentication.encoding.PasswordEncoder接口的实现类来定义。通过使用<authentication-provider>元素里的<password-encoder>声明我们能够很容易地配置密码编码:
<authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="jdbcUserService"> <password-encoder hash="sha"/> </authentication-provider> </authentication-manager>
你可能会很高兴的了解到Spring Security已经提供了一系列PasswordEncoder的实现,它们可以用于不同的需求和安全需要。要使用哪个实现可以通过<password-encoder>元素的hash属性来指定。
以下的列表列出了内置的实现类以及它们的优点。这些实现类都在o.s.s.authentication.
Encoding包下。
实现类 |
描述 |
hash值 |
PlaintextPasswordEncoder |
以明文的形式编码。DaoAuthenticationProvider默认的密码编码器。 |
plaintext |
Md4PasswordEncoder |
PasswordEncoder使用MD4 hash算法。MD4并不是一个安全的算法——不推荐使用这个编码器 |
md4 |
Md5PasswordEncoder |
PasswordEncoder使用MD5的单向编码算法。 |
md5 |
ShaPasswordEncoder |
PasswordEncoder使用SHA单向加密算法。这个编码器支持配置密码的强度级别。 |
sha sha-256 |
LdapShaPasswordEncoder |
在集成LDAP认证存储时使用,实现了LDAP SHA和LDAP SSHA算法。我们将会在第九章:LDAP目录服务讲述LDAP时,学习更多关于这个算法的知识。 |
{sha} {ssha} |
与Spring Security其他领域一样,可以引用一个PasswordEncoder的实现类以提供更精确的配置,并允许PasswordEncoder通过依赖注入织入到其它的bean中。对于JBCP Pets来说,我们需要使用这个bean引用的方法来编码用户的初始数据。
让我们了解一下为JBCP Pet应用配置基本密码编码的过程。
配置密码编码
配置基本的密码编码涉及到两个地方——在我们的SQL脚本执行后,加密载入数据库中数据的密码,并确保DaoAuthenticationProvider被配置成使用PasswordEncoder。
配置PasswordEncoder
首先,作为通常的Spring bean,声明一个PasswordEncoder的实例
<bean class="org.springframework.security.authentication. encoding.ShaPasswordEncoder" id="passwordEncoder"/>
你会发现我们使用了SHA-1的PasswordEncoder实现。这是一个高效的单向加密算法,在密码存储中经常用到。
配置AuthenticationProvider
我们需要配置DaoAuthenticationProvider来持有一个对PasswordEncoder的引用,这样它就可以在用户登录时,编码并比较用户提供的密码。添加<password-encoder>声明并指向我们在前面定义的bean的ID:
<authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="jdbcUserService"> <password-encoder ref="passwordEncoder"/> </authentication-provider> </authentication-manager>
如果在此时重启应用,并尝试登录,你会发现前面合法的登录凭证现在都会被拒绝。这是因为数据库中存储的密码(在启动时通过test-users-groups-data.sql脚本加载的)并没有以加密的形式存储。我们需要用一些java代码对启动数据进行后置的处理。
编写数据库启动的密码编码器
我们对SQL加载的数据进行编码的方式是使用了Spring bean的初始化方法,它将在embedded-database bean实例化完成后执行。这个bean, com.packtpub.springsecurity.security.DatabasePasswordSecurerBean很简单:
public class DatabasePasswordSecurerBean extends JdbcDaoSupport { @Autowired private PasswordEncoder passwordEncoder; public void secureDatabase() { getJdbcTemplate().query("select username, password from users", new RowCallbackHandler(){ @Override public void processRow(ResultSet rs) throws SQLException { String username = rs.getString(1); String password = rs.getString(2); String encodedPassword = passwordEncoder.encodePassword(password, null); getJdbcTemplate().update("update users set password = ? where username = ?", encodedPassword,username); logger.debug("Updating password for username: "+username+" to: "+encodedPassword); } }); } }
代码使用了JdbcTemplate功能来遍历所有的数据库中所有的用户并使用注入的PasswordEncoder引用对密码进行编码。每一个密码都进行了更新。
配置启动的密码编码
我们需要配置这个Spring bean的声明以使其在web应用启动时及<embedded-database>初始化后再进行该类的初始化。Spring bean的依赖跟踪机制保证DatabasePasswordSecurerBean能够在合适的时机执行:
<bean class="com.packtpub.springsecurity.security. DatabasePasswordSecurerBean" init-method="secureDatabase" depends-on="dataSource"> <property name="dataSource" ref="dataSource"/> </bean>
如果你此时重启JBCP Pets应用,你会发现数据库中的密码已经进行了编码,登录功能可以正常使用了。
评论
除非使用 https, 但普通网站,基本不会 https;
多谢你的夸奖,全书已经翻译完,会陆续上传
会坚持下去的,预计9月份译完,看到好多朋友都在踩,能给点意见吗?
发表评论
-
《Spring In Action》第三版译序
2013-07-12 12:19 3029《Spring In Action》第三 ... -
Tomcat源码解读系列(四)——Tomcat类加载机制概述
2012-09-23 22:23 10425声明:源码版本为Tomcat 6.0.35 ... -
Tomcat源码解读系列(三)——Tomcat对HTTP请求处理的整体流程
2012-09-09 22:34 6911声明:源码版本为Tomcat 6.0.35 前面的文章 ... -
Tomcat源码解读系列(二)——Tomcat的核心组成和启动过程
2012-09-02 16:59 6339声明:源码版本为Tom ... -
Tomcat源码解读系列(一)——server.xml文件的配置
2012-08-25 07:31 6434Tomcat是JEE开发人员最常用到的开发工具,在Jav ... -
Spring Security 3全文下载
2012-03-15 20:31 20360本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6539附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5319第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 7962第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4914在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6194第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8626高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12320第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6445明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7176LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6172第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2928属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5394OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7560第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2700典型ACL部署所要考虑的事情 ...
相关推荐
自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...
《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...
《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...
SecurityContext 是 Spring Security 中的一个重要概念,表示当前用户的安全上下文。SecurityContext 中包含用户的身份信息、权限信息等。SecurityContext 是通过 SecurityContextHolder 实现的。 五、Spring ...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...
- Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...
以上只是Spring Security学习过程中的一部分要点,实际上,这个框架非常深奥,包含了许多高级特性,如频道安全、密码存储、国际化的错误消息等。在学习时,建议结合实际项目实践,这样能更好地理解和掌握其工作原理...
#### 第四章:凭证安全存储 **使用数据库后台的认证** - **配置**:通过配置`UserDetailsService`接口实现与数据库交互。 - **实现细节**:使用JDBC访问数据库,获取用户信息。 **安全的密码配置** - **密码编码**...
7. **OAuth2整合**:Spring Security可以与OAuth2框架集成,支持第三方身份验证服务,如Google、Facebook等,实现社交登录功能。 8. **Web安全**:文档涵盖了HTTP基本认证、表单登录、HTTP方法转换、XSS防护、点击...
Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...
- OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource Sharing):SpringSecurity...
第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用中心认证服务 第十一章:客户端证书认证 第十二章:...
- Spring Security 3.x也可以与OAuth2协议集成,支持第三方服务的授权,提供安全的API访问。 8. **自定义扩展** - Spring Security的灵活性允许开发者根据需求自定义认证和授权策略,可以通过实现接口或继承类来...
7. **OAuth2支持**:SpringSecurity还支持OAuth2协议,提供了一种安全的第三方应用访问资源的方式。 8. **Remember-Me服务**:允许用户在一段时间内无须再次输入登录凭据,提高用户体验。 9. **自定义扩展**:...
3. **Client**: 第三方应用,需要获取用户授权来访问资源服务器上的资源。 Sparklr2是一个模拟的社交网络服务,它实现了OAuth 2.0的资源服务器。它会验证访问令牌,确保只有经过授权的客户端才能访问用户数据。Tonr...
- 密码通常需要加密存储,Spring Security 提供了通用的密码加密机制,如 BCrypt 或 PBKDF2,这些算法能提供足够的安全性,防止明文密码泄露。 11. **Remember-Me(记住我)认证**: - Remember-Me 功能允许用户...
根据给定的信息,我们可以从《Spring Security3 中文版》一书中提炼出多个重要的知识点,主要涉及Spring Security的基础概念、具体实现以及高级配置等方面。下面将详细解释每一部分的关键内容。 ### 第一章:一个不...