SpringSecurity中使用MD5密码加密

前言:

在上一篇中说到了SpringSecurity中的表单验证和权限控制,接下来说一下如果你在SpringSecurity中不使用默认的加密方式,而是使用自定义的加密方式,比如MD5,该如何继承呢?

一、为什么使用加密

我们先来说一下使用加密后的密码处理流程。我们为什么要使用密文呢?也就是加密后的密码呢?如果一个用户在网站注册时写入的密码是123456,当他点击保存之后,如果不加密的话,在数据库中存的就是123456,这样有什么不好吗?答案是肯定的,想想12306密码泄露导致用户所有信息泄露,是用户密码不够复杂吗?可能是?但是最主要的原因是数据库中如果使用的是明文,黑客很容易就会进行破解,而且一旦破解了一个密码可能就会拿到一组数据,为了方便大家理解,画了张草图:而且数据库中密码为123456的用户绝对不是2个,大家可以想象后果由多可怕了吗。。。

二、MD5+salt

其实关于这个问题上网就可以收集到,这里不再赘述,大家百度下概念就好,我们这里主要说在SpringSecurity中使用MD5,我们知道单纯的MD5加密并不是安全的,而如果我们使用MD5加盐的方式去对密码进行加密,那么想要破解的话难度系数就会成倍出现,基本上是不可能破解的。大家都知道MD5是不可逆的,也就是说加密完的密码无法进行解密,要不然怎么会是安全的呢?那我们来看下如果使用了MD5加密的话,黑客在获取密码的时候会是怎样的呢?还是和上面一样给大家画个草图方便理解吧。

虽然说张三和李四在注册的时候都使用的是123456作为密码。但是在保存到数据库之前,我们首先进行了MD5+salt操作,到数据库中的是显然不同的2个密文,这时黑客拿到密文之后进行破解,破解出来以后去登录,发现只有张三能登录,而李四的并不能登录,这时为什么呢?因为在登录的时候我们会把用户输入的明文以之前的加密方式再次加密得到一个密文,然后拿这个密文和数据库之前保存的密文比较,如果相同才会放行,显然张三和李四的密文不同,所以即使张三的密码被破译了,但是李四的123456密码还是安全的。老规矩还是画个草图。。这个图也就是SpringSecurity对密码进行比较的流程。。

这样的话就可以对密码进行很好的保护,接下来我们看一下在项目中具体该如何使用

三、自定义PasswordEncoder

在SpringSecurity中要想使用自定义的密码加密。首先要new一个xxxPasswordEncoder,然后SpringSecurity会使用你定义的Encoder去比对密码。首先我们要编写一个类来实现PasswordEncoder接口, 我们来看下PasswordEncoder中为我们提供了什么方法。

一个是encode方法是用来对明文密码加密的方法,也就是重写PasswordEncoder之后我们自定义的加密方法就写在encode里,

另外一个是matches很明显是一个匹配密码的方法,第一个参数是要匹配的密码,第二个参数是加密后的encode密文。我们的解密方法(其实是用相同的加密方式再次加密后比较)就写在这里。来看下我自定义的MD5PasswordEncoder吧:

大家可以看到在匹配的时候,是拿原来的密码进行相同的加盐方式进行加密,然后去比对之前保存的密文。

四、SpringSecurity处理MD5

其实这个就很简单了,就是在你save数据之前,调用一下加密的方法,也就是上面自定义的encoder。然后把拿到的用户明文密码填充进去。这里就不再赘述,重点看SpringSecurity处理,还是使用上篇中我们提到的UserDetails实现类,你只需要在返回User对象的时候将password从数据库中读取出来,传给SpingSecurity,它会自动匹配matches方法进行比对。所以我们的代码这样的:

然后把密码直接传进去:可以重写User对象返回自己的调用逻辑,这里就直接返回User,上篇提到过。

然后的处理就很简单了,我们只需要把自己的PasswordEncoder以Bean的形式告诉SpringSecurity,可以理解为:告诉SpringSecurity我要用我自定义的Encoder来处理密码,你去调用它。所以我们在LoginSecurityConfig(就是你实现了WebSecurityConfigurerAdapter抽象类的那个方法 )注册一个bean就好了,如下:

五、总结

这样在SpringSecurity中我们就使用了自定的加密方法让SpringSecurity去帮我们处理密码匹配。下篇我们说下SpringSecurity中常用的方法以及原理。谢谢大家~

猜你喜欢

转载自blog.csdn.net/qq_32967665/article/details/86347263