循序渐进学spring security 第八篇,如何配置密码加密?是否支持多种加密方案?

回顾

前面我们介绍了spring security的登录验证,涉及到密码的都是明文存储,明文匹配的,这在企业项目开发中是不允许的,要是不小心被客户知道了,会投诉企业,指不定会破产,好了,在阅读本文之前,建议先看我之前的文章,方便更好的理解!

  1. 面试不要在说不熟悉spring security了,一个demo让你使劲忽悠面试官
  2. 循序渐进学习spring security 第二篇,如何修改默认用户?
  3. 循序渐进学习spring security 第三篇,如何自定义登录页面?登录回调?
  4. 循序渐进雪spring security 第四篇,登录流程是怎样的?登录用户信息保存在哪里?
  5. 循序渐进学习spring security 第五篇,如何处理重定向和服务器跳转?登录如何返回JSON串?
  6. 循序渐进学spring security第六篇,手把手教你如何从数据库读取用户进行登录验证,mybatis集成
  7. 循序渐进学spring security 第七篇,如何基于用户表和权限表配置权限?越学越简单了

密码明文会带来什么问题?

2011 年 12 月,有人在网络上公开了600 万个 CSDN 用户资料的数据库,数据全部为明文储存,包含用户名、密码以及注册邮箱。事件发生后 CSDN 在微博、官方网站等渠道发出了声明,解释说此数据库系 2009 年备份所用,因不明原因泄露,已经向警方报案,后又在官网发出了公开道歉信。在接下来的十多天里,金山、网易、京东、当当、新浪等多家公司被卷入到这次事件中。整个事件中最触目惊心的莫过于 CSDN 把用户密码明文存储,由于很多用户是多个网站共用一个密码,因此一个网站密码泄露就会造成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。

2018年,我在一家专门做户外平台的企业工作,该企业主要是做户外活动平台,用户量有300万+,进入公司一段时间后,发现了一个重要秘密,用户的密码竟然是明文存储在数据库中的!这是多少危险的事情啊,万一被不怀好意的人把密码泄漏出去,指不定会做出来什么坏事!可能会让客户倾家荡产,客户倾家荡产,这家公司还能平安无事吗?

而作为开发工程师,在企业项目开发中,也许你不是项目的负责人,但是确实执行人,如果出现密码明文泄漏了,企业被投诉,会不找你来背锅吗?到时只能吃哑巴亏了

如何加密?

密码加密一般会用到散列函数,又称散列算法、哈希函数,这是一种从任何数据中创建数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来,然后将数据打乱混合,重新创建一个散列值。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。我们常用的散列函数有 MD5 消息摘要算法、安全散列算法(Secure Hash Algorithm)。

仅仅使用散列函数还不够,为了增加密码的安全性,一般在密码加密过程中还需要加盐,所谓的盐可以是一个随机数也可以是用户名,加盐之后,即使密码明文相同的用户生成的密码密文也不相同,这可以极大的提高密码的安全性。但是传统的加盐方式需要在数据库中有专门的字段来记录盐值,这个字段可能是用户名字段(因为用户名唯一),也可能是一个专门记录盐值的字段,这样的配置比较繁琐。

Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供 strength 和 SecureRandom 实例。strength 越大,密钥的迭代次数越多,密钥迭代次数为 2^strength。strength 取值在 4~31 之间,默认为 10。

不同于 Shiro 中需要自己处理密码加盐,在 Spring Security 中,BCryptPasswordEncoder 就自带了盐,处理起来非常方便。

而 BCryptPasswordEncoder 就是 PasswordEncoder 接口的实现类。

PasswordEncoder 加密接口

PasswordEncoder 这个接口中就定义了三个方法

publicinterface PasswordEncoder {
   
	String encode(CharSequence rawPassword);
	boolean matches(CharSequence rawPassword, String encodedPassword);
	default 
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴你有兴趣Spring SecuritySpring Security是一个强大且广泛使用的身份验证和授权框架,用于保护Java应用程序。下面是一个循序渐进Spring Security的步骤: 1. 了解基本概念:开始习之前,先了解一些基本概念,如认证、授权、角色、权限等。这将为你理解Spring Security的工作原理提供基础。 2. 添加依赖:在你的项目中添加Spring Security的依赖。你可以在Maven或Gradle配置文件中添加相应的依赖项。 3. 配置Spring Security:在你的应用程序中,配置Spring Security以启用各种安全功能。可以通过XML配置文件或Java配置类来完成配置。 4. 用户认证:配置用户认证机制,例如使用数据库存储用户信息,或者LDAP服务器进行认证。你可以选择适合你需求的认证方式。 5. 授权:一旦用户通过认证,就需要定义权限和角色,并将其分配给用户。这样可以限制用户对应用程序中特定功能的访问。 6. 表单登录:配置表单登录机制,以便用户可以通过用户名和密码进行登录。你可以在登录页面上定义自定义字段并进行验证。 7. 安全注解:使用安全注解来保护你的应用程序中的特定方法或URL。通过在方法或控制器上添加注解,你可以指定谁可以访问该方法或URL。 8. CSRF保护:配置跨站请求伪造(CSRF)保护,以防止恶意用户利用用户的身份进行不良操作。 9. 自定义登录:如果需要,可以自定义登录页面和流程。这允许你根据你的需求进行更多的个性化定制。 10. 测试和调试:最后,在你的应用程序中进行测试和调试,确保Spring Security的各项功能都正常工作。 以上是一个循序渐进Spring Security的基本步骤。当然,这只是一个简要的介绍,你可以根据项目需求进行更深入的习和实践。祝你习愉快!如果你有其他问题,我愿意继续帮助你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值