简单自定义登录流程问题解析
对day1-3中简单自定义登录流程梳理问题
为什么需要在密码前加{noop}(密码加密存储)
真实项目中密码不使用明文,而是经过加密的
而默认规定使用PasswordEncoder要求数据库中的密码格式为:{id}password
,会通过id来判断密码的加密方式,然而我们一般不会采用这种方式,所以我们会对PasswordEncoder进行替换为SpringSecurity中提供的BCryptPasswordEncoder
密码加密简介
我看了很多文章,个人认为要么看官网的解释,要么大家看这篇文章:Spring Security系列教程22–Spring Security中的密码加密——from 一一哥Sun
散列加密概述
我们开发时进行密码加密,可用的加密手段有很多,比如对称加密、非对称加密、信息摘要等。在一般的项目里,常用的就是信息摘要算法,也可以被称为散列加密函数,或者称为散列算法、哈希函数
。这是一种可以从任何数据中创建数字“指纹”的方法,常用的散列函数有 MD5 消息摘要算法、安全散列算法(Secure Hash Algorithm)等
。
散列加密原理
散列函数通过把消息或数据压缩成摘要信息,使得数据量变小,将数据的格式固定下来,然后将数据打乱混合,再重新创建成一个散列值,从而达到加密的目的。
散列值通常用一个短的随机字母和数字组成的字符串来代表,一个好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理时,如果我们不抑制冲突来区别数据,会使得数据库中的记录很难找到。
但是仅仅使用散列函数还不够,如果我们只是单纯的使用散列函数而不做特殊处理,其实是有风险的!比如在两个用户密码明文相同时,生成的密文也会相同,这样就增加了密码泄漏的风险。
所以为了增加密码的安全性,一般在密码加密过程中还需要“加盐”,而所谓的“盐”可以是一个随机数,也可以是用户名。”加盐“之后,即使密码的明文相同,用户生成的密码密文也不相同,这就可以极大的提高密码的安全性。
传统的加盐方式需要在数据库中利用专门的字段来记录盐值,
这个字段可以是用户名字段(因为用户名唯一),也可以是一个专门记录盐值的字段,但这样的配置比较繁琐。
Spring Security中的密码处理方案
那么在Spring Security中,对密码是怎么进行处理的呢?其实Spring Security对密码的处理方案,有如下3种方式:
- 对密码进行明文处理,即不采用任何加密方式;
- 采用MD5加密方式;
- 采用哈希算法加密方式。
如何使用BCryptPasswordEncoder?
采用自动注入方式ÿ