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

《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  
坚持下去哦。

相关推荐

    springSecurity3中文文档

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

    spring security 参考手册中文版

    第四部分 Web应用程序安全 112 13.安全过滤器链 112 13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5与其他基于过滤器的...

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

    NULL 博文链接:https://lengyun3566.iteye.com/blog/1141347

    spring security 登录、权限管理配置

    登录流程 1)容器启动(MySecurityMetadataSource:loadResourceDefine加载系统资源与权限列表) ... 执行第6步,否则执行第7步。 6)登录 7)验证并授权(MyUserDetailServiceImpl:loadUserByUsername) 内附完整数据库

    Spring攻略PDF版

     第3章 Spring中的Bean配置   3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案...

    security:Spring Security 开发安全的REST服务 —— JoJozhai

    本来是 fork 了 老师的源码的() 跟着学了两章后,发现还是少了点感觉,干脆自己重新码一遍吧 :beaming_face_with_smiling_eyes: 小目标 ...第4章 使用Spring Security开发基于表单的登录 4-1 简介 4-2

    Spring攻略中文版PDF

     第3章 Spring中的Bean配置   3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案...

    Spring攻略英文版(附带源码)

     第3章 Spring中的Bean配置   3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案   ...

    SpringCloud视频教程全套百度网盘

    第4章 SpringSecurity安全详细讲解及应用 第5章 RabbitMQ高级消息的讲解及应用 第6章 ElasticSearch详细讲解及应用 第7章 Eureka分布式服务器的搭建 。。。。。。。。。 第15章 SpringCloud项目实战 。。。。。。。...

    SpringSecurity:Spring安全

    SpringSecurity第1部分初始设定第2部分我们向您展示了如何使用Spring的UserDetailService接口来实现自己的身份验证。第三部分定制表格第4部分使用Spring Security保护您的REST调用。

    Spring-Security-Third-Edition:Spring Security第三版,由Packt发行

    在整本书中一直用作视图模板引擎章节LDAP目录服务记住我的服务使用TLS的客户端证书身份验证打开OAuth2 使用中央身份...安全性迁移到Spring Security 4.2生成并运行代码示例代码软件要求JDK 8 Gradle4.x IntelliJ 2017+...

    Spring攻略(第三版)源代码

    3. Spring Annotation Driven Core Tasks 4. Spring @MVC 5. Spring REST 6. Spring Deployment to the Cloud 7. Spring Social 8. Spring Security 9. Spring Mobile 10. Spring with other Web Frameworks 11. ...

    第 5-1 课:使⽤ Spring Boot Security 进⾏安全控制1

    (1)添加依赖: (2)配置文件 (3)创建页面 (4)添加访问入口 (5)添加 Spring Security 依赖 (6)进行分析

    Spring攻略(第二版 中文高清版).part1

    第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案...

    Spring in Action(第2版)中文版

    第三部分spring客户端 第13章处理web请求 13.1开始springmvc之旅 13.1.1请求生命中的一天 13.1.2配置dispatcherservlet 13.1.3springmvc概述 13.2将请求映射到控制器 13.2.1使用simpleurlhandlermapping ...

    SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发的java web轻量级小巧视频网站系统

    SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 ...

    spring-security-samples

    扫码加微信(微信ID: a_java_boy2 ),备注SpringSecurity,进群讨论。 扫码关注微信公众号【江南一点雨】 ,回复SS获取Spring安全系列完整文章: 本仓库部分Demo有配套视频 视频地址: : 欢迎大家在B站关注我,...

    Spring攻略(第二版 中文高清版).part2

    第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案...

    Spring in Action(第二版 中文高清版).part2

    第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置DispatcherServlet 13.1.3 Spring MVC概述 13.2 将请求映射到控制器 13.2.1 使用SimpleUrlHandler ...

Global site tag (gtag.js) - Google Analytics