`
kong0itey
  • 浏览: 304858 次
社区版块
存档分类
最新评论

《Spring Security3》第四章第三部分翻译上(配置安全的密码)(转载)

阅读更多

 

配置安全的密码

         我们回忆第一章:一个不安全应用的剖析 中,审计人员认为密码以明文形式进行存储是最高优先级的安全风险。实际上,在任何安全系统中,密码安全都是保证已经经过认证的安全实体是真实可靠的重要方面。安全系统的设计人员必须保证密码存储时,任何恶意的用户想要进行破解都是非常困难的。

         在数据库存储时,需要遵守以下的准则:

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> 声明我们能够很容易地配置密码编码:

 

Xml代码  收藏代码
  1. < authentication-manager   alias = "authenticationManager" >   
  2.   < authentication-provider   user-service-ref = "jdbcUserService" >   
  3.     < password-encoder   hash = "sha" />   
  4.   </ authentication-provider >   
  5. </ 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 的实例

 

Xml代码  收藏代码
  1. < bean   class ="org.springframework.security.authentication.   
  2.              encoding.ShaPasswordEncoder" id = "passwordEncoder" />   

 你会发现我们使用了 SHA-1 PasswordEncoder 实现。这是一个高效的单向加密算法,在密码存储中经常用到。

配置 AuthenticationProvider

         我们需要配置 DaoAuthenticationProvider 来持有一个对 PasswordEncoder 的引用,这样它就可以在用户登录时,编码并比较用户提供的密码。添加 <password-encoder> 声明并指向我们在前面定义的 bean ID

 

Xml代码  收藏代码
  1. < authentication-manager   alias = "authenticationManager" >   
  2.   < authentication-provider   user-service-ref = "jdbcUserService" >   
  3.     < password-encoder   ref = "passwordEncoder" />   
  4.   </ authentication-provider >   
  5. </ authentication-manager >   

 如果在此时重启应用,并尝试登录,你会发现前面合法的登录凭证现在都会被拒绝。这是因为数据库中存储的密码(在启动时通过 test-users-groups-data.sql 脚本加载的)并没有以加密的形式存储。我们需要用一些 java 代码对启动数据进行后置的处理。

编写数据库启动的密码编码器

         我们对 SQL 加载的数据进行编码的方式是使用了 Spring bean 的初始化方法,它将在 embedded-database bean 实例化完成后执行。这个 bean com.packtpub.springsecurity.security.DatabasePasswordSecurerBean 很简单:

 

Java代码  收藏代码
  1. public   class  DatabasePasswordSecurerBean  extends  JdbcDaoSupport {  
  2.   @Autowired   
  3.   private  PasswordEncoder passwordEncoder;  
  4.     
  5.   public   void  secureDatabase() {  
  6.     getJdbcTemplate().query("select username, password from users" ,   
  7.                              new  RowCallbackHandler(){  
  8.       @Override   
  9.       public   void  processRow(ResultSet rs)  throws  SQLException {  
  10.         String username = rs.getString(1 );  
  11.         String password = rs.getString(2 );  
  12.         String encodedPassword =   
  13.                passwordEncoder.encodePassword(password, null );  
  14.         getJdbcTemplate().update("update users set password = ?   
  15.            where username = ?", encodedPassword,username);  
  16.         logger.debug("Updating password for  username:   
  17.                      "+username+"  to: "+encodedPassword);  
  18.       }  
  19.     });  
  20.   }  
  21. }  
 

 

 

代码使用了 JdbcTemplate 功能来遍历所有的数据库中所有的用户并使用注入的 PasswordEncoder 引用对密码进行编码。每一个密码都进行了更新。

配置启动的密码编码

我们需要配置这个 Spring bean 的声明以使其在 web 应用启动时及 <embedded-database> 初始化后再进行该类的初始化。 Spring bean 的依赖跟踪机制保证 DatabasePasswordSecurerBean 能够在合适的时机执行:

 

Xml代码  收藏代码
  1. < bean   class ="com.packtpub.springsecurity.security.   
  2.              DatabasePasswordSecurerBean"   
  3.              init-method = "secureDatabase"   depends-on = "dataSource" >   
  4.   < property   name = "dataSource"   ref = "dataSource" />   
  5. </ bean >   

 如果你此时重启 JBCP Pets 应用,你会发现数据库中的密码已经进行了编码,登录功能可以正常使用了。

分享到:
评论

相关推荐

    Spring Security3中文文档

    该章节分为两个部分,介绍了Spring Security3的基础概念,包括如何设置安全上下文、理解Spring Security的架构以及如何使用Spring Security进行基本的认证和授权。 ### 第二章:深入理解Spring Security3 本章深入...

    《Spring Security3》第二章第三部分翻译(下)附前两章doc文档

    《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...

    spring security3 中文版本

    自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...

    《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)附前四章doc文件

    《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...

    Spring Security in Action

    SecurityContext 是 Spring Security 中的一个重要概念,表示当前用户的安全上下文。SecurityContext 中包含用户的身份信息、权限信息等。SecurityContext 是通过 SecurityContextHolder 实现的。 五、Spring ...

    Spring Security 资料合集

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...

    springSecurity3例子

    - Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...

    springsecurity学习笔记

    以上只是Spring Security学习过程中的一部分要点,实际上,这个框架非常深奥,包含了许多高级特性,如频道安全、密码存储、国际化的错误消息等。在学习时,建议结合实际项目实践,这样能更好地理解和掌握其工作原理...

    Spring Security3

    #### 第四章:凭证安全存储 **使用数据库后台的认证** - **配置**:通过配置`UserDetailsService`接口实现与数据库交互。 - **实现细节**:使用JDBC访问数据库,获取用户信息。 **安全的密码配置** - **密码编码**...

    Spring Security-3中文官方文档(及教程)

    7. **OAuth2整合**:Spring Security可以与OAuth2框架集成,支持第三方身份验证服务,如Google、Facebook等,实现社交登录功能。 8. **Web安全**:文档涵盖了HTTP基本认证、表单登录、HTTP方法转换、XSS防护、点击...

    spring security 官方文档

    Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...

    SpringSecurity笔记,编程不良人笔记

    - OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource Sharing):SpringSecurity...

    springsecurity3x快速构建企业级安全

    - Spring Security 3.x也可以与OAuth2协议集成,支持第三方服务的授权,提供安全的API访问。 8. **自定义扩展** - Spring Security的灵活性允许开发者根据需求自定义认证和授权策略,可以通过实现接口或继承类来...

    springSecurity3中文文档

    第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用中心认证服务 第十一章:客户端证书认证 第十二章:...

    SpringSecurity源码

    7. **OAuth2支持**:SpringSecurity还支持OAuth2协议,提供了一种安全的第三方应用访问资源的方式。 8. **Remember-Me服务**:允许用户在一段时间内无须再次输入登录凭据,提高用户体验。 9. **自定义扩展**:...

    Spring security oauth源码

    3. **Client**: 第三方应用,需要获取用户授权来访问资源服务器上的资源。 Sparklr2是一个模拟的社交网络服务,它实现了OAuth 2.0的资源服务器。它会验证访问令牌,确保只有经过授权的客户端才能访问用户数据。Tonr...

    Spring Security 教程(Spring Security Tutorial)1

    - 密码通常需要加密存储,Spring Security 提供了通用的密码加密机制,如 BCrypt 或 PBKDF2,这些算法能提供足够的安全性,防止明文密码泄露。 11. **Remember-Me(记住我)认证**: - Remember-Me 功能允许用户...

    Spring Security3 中文版 张卫滨 推荐

    根据给定的信息,我们可以从《Spring Security3 中文版》一书中提炼出多个重要的知识点,主要涉及Spring Security的基础概念、具体实现以及高级配置等方面。下面将详细解释每一部分的关键内容。 ### 第一章:一个不...

Global site tag (gtag.js) - Google Analytics