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

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

分享到:
评论

相关推荐

    白色大气风格的旅游酒店企业网站模板.zip

    白色大气风格的旅游酒店企业网站模板.zip

    python实现用户注册

    python实现用户注册

    【图像压缩】基于matlab GUI Haar小波变换图像压缩(含PSNR)【含Matlab源码 9979期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    (177354822)java小鸟游戏.zip

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    VB+access学生管理系统(论文+系统)(2024am).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    数学计算中的平方表与圆周率π的应用

    内容概要:文档名为《平方表,派表集合.docx》,主要内容是1至1000的平方值以及1至1000与π的乘积结果。每个数字从1开始,逐步增加至1000,对应地计算了平方值和乘以π后的值。所有计算均通过Python脚本完成,并在文档中列出了详细的计算结果。 适合人群:需要进行数学计算或程序验证的学生、教师和研究人员。 使用场景及目标:用于快速查找特定数字的平方值或其与π的乘积,适用于教学、科研及程序测试等场景。 阅读建议:可以直接查阅所需的具体数值,无需从头到尾逐行阅读。建议在使用时配合相应的计算工具,以验证和拓展数据的应用范围。

    VB+SQL光盘信息管理系统(源代码+系统+答辩PPT)(20244m).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    白色大气风格的健身私人教练模板下载.zip

    白色大气风格的健身私人教练模板下载.zip

    白色简洁风的商务网站模板下载.zip

    白色简洁风的商务网站模板下载.zip

    白色大气风格的前端设计案例展示模板.zip

    白色大气风格的前端设计案例展示模板.zip

    圣诞树项目中的硬件和MATLAB实现指南

    内容概要:本文介绍了两个有趣的圣诞树项目方向:一是使用Arduino或Raspberry Pi开发可编程的圣诞树灯光控制系统;二是基于MATLAB开发一个圣诞树模拟器。前者通过硬件连接、编写Arduino/Raspberry Pi程序、MATLAB控制程序来实现LED灯带的闪烁;后者则通过创建圣诞树图形、添加动画效果、用户交互功能来实现虚拟的圣诞树效果。 适合人群:具备基本电子工程和编程基础的爱好者和学生。 使用场景及目标:①通过硬件和MATLAB的结合,实现实际的圣诞树灯光控制系统;②通过MATLAB模拟器,实现一个有趣的圣诞树动画展示。 阅读建议:读者可以根据自己的兴趣选择合适的项目方向,并按照步骤进行动手实践,加深对硬件编程和MATLAB编程的理解。

    白色扁平风格的温室大棚公司企业网站源码下载.zip

    白色扁平风格的温室大棚公司企业网站源码下载.zip

    Navicat.zip

    Navicat.zip

    Scikit-learn库中主成分分析(PCA)技术的Python实现教程

    内容概要:本文详细介绍了主成分分析(PCA)技术的原理及其在Scikit-learn库中的Python实现。首先讲解了PCA的基本概念和作用,接着通过具体示例展示了如何使用Scikit-learn进行PCA降维。内容涵盖了数据准备、模型训练、数据降维、逆转换数据等步骤,并通过可视化和实际应用案例展示了PCA的效果。最后讨论了PCA的局限性和参数调整方法。 适合人群:数据科学家、机器学习工程师、数据分析从业者及科研人员。 使用场景及目标:适用于高维数据处理,特别是在需要降维以简化数据结构、提高模型性能的场景中。具体目标包括减少计算复杂度、提高数据可视化效果和改进模型训练速度。 其他说明:本文不仅提供了详细的代码示例,还讨论了PCA在手写数字识别和机器学习模型中的应用。通过比较原始数据和降维后数据的模型性能,读者可以更好地理解PCA的影响。

    (175846434)目标检测-将VOC格式的数据集一键转化为COCO和YOLO格式

    VOC格式的数据集转COCO格式数据集 VOC格式的数据集转YOLO格式数据集。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    数字信号处理课程设计.doc

    数字信号处理课程设计.doc

    白色扁平化风格的灯饰灯具销售企业网站模板.zip

    白色扁平化风格的灯饰灯具销售企业网站模板.zip

    华豫佰佳组合促销视图.sql

    华豫佰佳组合促销视图.sql

    白色大气风格的商务团队公司模板下载.zip

    白色大气风格的商务团队公司模板下载.zip

    白色大气风格的VPS销售网站模板.zip

    白色大气风格的VPS销售网站模板.zip

Global site tag (gtag.js) - Google Analytics