Spring Security学习 详细

本文深入探讨了Spring Security在密码存储方面的最佳实践,包括密码编码器如Pbkdf2PasswordEncoder,强调了自适应单向函数在密码安全中的重要性。同时,文章详细阐述了如何防止跨站请求伪造(CSRF)攻击,包括同步器令牌模式和使用SameSite属性。Spring Security提供了一套全面的解决方案,旨在保护应用程序免受常见安全威胁。
摘要由CSDN通过智能技术生成

Spring Security 是一个提供身份验证、授权和防止常见攻击的框架。凭借对保护命令式和反应式应用程序的一流支持,它是保护基于 Spring 的应用程序的事实标准。

Spring Security 为身份验证提供了全面的支持。身份验证是我们验证试图访问特定资源的人的身份的方式。验证用户的常用方法是要求用户输入用户名和密码。一旦执行了身份验证,我们就知道身份并可以执行授权。

密码存储

1、直接明文保存,比如用户设置的密码是“123456”,直接将“123456”保存在数据库中,这种是最简单的保存方式,也是最不安全的方式。但实际上不少互联网公司,都可能采取的是这种方式。
2、使用对称加密算法来保存,比如3DES、AES等算法,使用这种方式加密是可以通过解密来还原出原始密码的,当然前提条件是需要获取到密钥。不过既然大量的用户信息已经泄露了,密钥很可能也会泄露,当然可以将一般数据和密钥分开存储、分开管理,但要完全保护好密钥也是一件非常复杂的事情,所以这种方式并不是很好的方式。
3、使用MD5、SHA1等单向HASH算法保护密码,使用这些算法后,无法通过计算还原出原始密码,而且实现比较简单,因此很多互联网公司都采用这种方式保存用户密码,曾经这种方式也是比较安全的方式,但随着彩虹表技术的兴起,可以建立彩虹表进行查表破解,目前这种方式已经很不安全了。
4、特殊的单向HASH算法,由于单向HASH算法在保护密码方面不再安全,于是有些公司在单向HASH算法基础上进行了加盐、多次HASH等扩展,这些方式可以在一定程度上增加破解难度,对于加了“固定盐”的HASH算法,需要保护“盐”不能泄露,这就会遇到“保护对称密钥”一样的问题,一旦“盐”泄露,根据“盐”重新建立彩虹表可以进行破解,对于多次HASH,也只是增加了破解的时间,并没有本质上的提升。
5、PBKDF2算法,该算法原理大致相当于在HASH算法基础上增加随机盐,并进行多次HASH运算,随机盐使得彩虹表的建表难度大幅增加,而多次HASH也使得建表和破解的难度都大幅增加。该算法也是美国国家标准与技术研究院推荐使用的算法。
6、bcrypt、scrypt等算法,这两种算法也可以有效抵御彩虹表,使用这两种算法时也需要指定相应的参数,使破解难度增加。

Spring Security 的PasswordEncoder接口用于执行密码的单向转换,以允许安全地存储密码。

现在鼓励开发人员利用自适应单向函数来存储密码。使用自适应单向函数验证密码是有意占用资源(即 CPU、内存等)的。自适应单向功能允许配置“工作因数”,该“工作因数”会随着硬件变得更好而增长。建议将“工作因素”调整为大约需要 1 秒来验证系统上的密码。这种权衡是为了让攻击者难以破解密码,但成本不会太高,它会给您自己的系统带来过多的负担。Spring Security 试图为“工作因素”提供一个良好的起点,但鼓励用户为自己的系统自定义“工作因素”,因为性能会因系统而异。bcrypt、PBKDF2、scrypt和argon2。

由于自适应单向函数有意占用大量资源,因此为每个请求验证用户名和密码会显着降低应用程序的性能。Spring Security(或任何其他库)无法加速密码验证,因为通过使验证资源密集来获得安全性。鼓励用户将长期凭证(即用户名和密码)交换为短期凭证(即会话、OAuth 令牌等)。可以快速验证短期凭证,而不会损失任何安全性。

委托密码编码器

示例 1. 创建默认 DelegatingPasswordEncoder

PasswordEncoder passwordEncoder =
    PasswordEncoderFactories.createDelegatingPasswordEncoder();

示例 2. 创建自定义 DelegatingPasswordEncoder

String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncod
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值