`
lengyun3566
  • 浏览: 452373 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
D59180b9-02f1-3380-840c-ea34da46143c
《Spring Secur...
浏览量:383297
社区版块
存档分类
最新评论

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

 

<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 SHALDAP 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-1PasswordEncoder实现。这是一个高效的单向加密算法,在密码存储中经常用到。

配置AuthenticationProvider

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

 

<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应用,你会发现数据库中的密码已经进行了编码,登录功能可以正常使用了。

 

  • 大小: 40.8 KB
13
15
分享到:
评论
9 楼 gloot 2015-06-02  
这个密码安全么,在客户端到服务端,这段就不安全了;

除非使用 https, 但普通网站,基本不会 https;

8 楼 lilihongmm 2014-11-03  
从第一章看到这 翻译的还是不错啊 配合例子看 效率蛮高的
7 楼 jinnianshilongnian 2012-03-20  
转载到这里 顶顶顶
6 楼 lengyun3566 2012-01-06  
sunlianzhi 写道
踩的人有可能是羡慕嫉妒恨在作祟,你翻译的很清楚,起码我能很轻松的阅读完并学到很多知识。加油!

多谢你的夸奖,全书已经翻译完,会陆续上传
5 楼 sunlianzhi 2012-01-06  
踩的人有可能是羡慕嫉妒恨在作祟,你翻译的很清楚,起码我能很轻松的阅读完并学到很多知识。加油!
4 楼 shizhijie737 2011-10-27  
翻译好了,跟原作者联名出版了吧,楼主翻译的比一些垃圾出版社翻译的强多了。而且小心不要被不法出版社给抄袭了
3 楼 shizhijie737 2011-10-27  
加油啊,我们都等着看整书
2 楼 lengyun3566 2011-07-31  
edi 写道
坚持下去哦。

会坚持下去的,预计9月份译完,看到好多朋友都在踩,能给点意见吗?
1 楼 edi 2011-07-31  
坚持下去哦。

相关推荐

    spring security3 中文版本

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

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

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

    《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...

    springSecurity3中文文档

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

    springsecurity3x快速构建企业级安全

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

    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