00:00
接下来我们来说一下密码的加密存储,首先呢,我们针对密码的这种特性,比如我们在这儿存储了一个密码,如果呢,一些非法人员通过爆破我们的数据库,您得到了我们这些账号密码,那如果我们存铭文,这肯定有问题,这是第一个,第二个我们要存密文的话,存什么样的密文,现在呢,我们来考虑两种,一种是可逆的加密和另外一种不可逆的加密。所谓的可逆加密,那就是我们通过密文可以推算出它原来的铭文,假设我知道它的加密算法,那不可逆加密就是我即使知道它的这个算法,但是呢,我从这个密文我推断不出它的铭文,那我们就应该呢,把它密码这个字段我存为不可逆的才合理,要不然别人爆破到了我们的密码数据库,而且呢,通过一些非法手段。
01:00
也知道了我们的加密算法,那这样呢,他们可以完全解析出所有用户的铭文密码,所以呢,我们应该做到的就是即使知道我们的加密算法,它也呢不能反推出我们的铭文,那在我们的不可逆加密的过程中,我们在密码存储呢,给大家推荐的是我们使用MD5,后来我们说的MD5颜值加密,那严格意义上讲MD5呢,它不算一个加密算法,它呢是一个信息摘要算法,也叫消息摘要算法,消息摘要算法呢,它的特点就是比如我们这有一大段的文本,我们呢,它可以最终根据这个文本特征值得出一个固定长度的MD5值,而且呢,这个文本长度只要里边有一个字节发生了变化,我们的MD5就会发生变化,虽然它只是一个信息摘务算法,但利用这种我们可以来做密码的存储,我们MD5呢?
02:00
有集中非常好的特性,第一种呢叫压缩性,就是我们任意长度的数据,我们都可以算出一个固定的MD5值,我们即使是1G的数据,我们算它的MD5值都是固定长度的,那大家现在网上呢,有一个这样的应用,大家考虑一下百度网盘呢,有一个秒传功能,那大家猜一下这个秒传它是怎么做的呢?应该是这样子的,我们百度网盘在上传我们的这个文件之前,它对我们这个文件进行一个MD5计算,然后呢,算出我们这个MD5的值,如果我们这个文件以前上传过,或者呢别人上传过,而且MD5的最大特点就是呢,强抗碰撞,也要说只要我们这个内容不变,它计算出的MD5值永远都是一样的,而且永远找不到我们两个,几乎不可能找到两个不一样的内容。对应的MD。五值是相。
03:00
等等,从秒传就可以利用这种特点,我们要上传的这个文件,它计算一个MD5,去我们百度的整个数据库里边来进行匹配,看我们之前有没有哪个文件的MD5跟它是一样的,那如果一样的我们就可以不用传了,那么这个PV成功了,那就秒传了,其实并不是我们网速有多快,所以呢,这就是MD5的一种利用场景。然后接下来第二个它的压缩性,就是我们无论多大的文件,最终都是一个固定长度的串,还有我们呢,容易计算,就我们无论是什么数据,算MD5呢,是很快的,很简单的。还有我们的抗修改性,只要原数据,我们无论是一段文本还是一个文件里边,哪怕动上一个字节,他得到的MD5值跟他之前呢,就会一点都不一样,有很大的区别,还有我们刚才说的强抗碰撞,只要是不同的东西,他们得到的MD5值永远是不一样的。
04:00
那么利用MD5这个最大的特点,而它最大的特点就是呢,是不可逆的,因为呢,我们不能从一串MD5值,我们即使知道它是用MD5算出来的这一串值,我们从这个值不能推出我们之前的铭文是什么,我们可以给大家算一个MD5,让大家看一下,好我们在这个测试类里边,比如我们来计算一个MD5,好们来进行一个测试,把原来的spring boot测试我就来注掉,我们现在不用启动spring boot整个测试,那就简单计算MD5,那在我们的阿帕奇里边呢,有一个叫dIgEst YouTube,我们导了阿帕奇coms,诶里边这个code它都已经带了这个,这是一款加密工具,好它是一个工具,我们呢使用MD5进行加密,好我就来用MD5,而且呢,把加密的这个内容,这要传我们这个进行MD5计算的内容,最终得到一个字符串,哎,我们使用它转成16G进字符串的。
05:00
方式好,我们就调用这个方法,MD5EX,比如呢,我们来加密了一串123456,好,那得到一串MD5值来输出一下,输出一下S,好,我们来看一下这串MD5值走好123456得到的MD5值呢,那就是这样。而且呢,我们无论何时来计算123456的MD5来再算一次,它呢,只要123456不变,它永远都是这样,哪怕我们给这多一个空格,那我们再来进行计算。那MD5呢,就跟原来会有很大的不同,诶我们发现这两个MD51点都不一样,所以呢,这是我们说的MD5的这个特性就是抗修改性,只要呢修改了一个,那么就呢会发生很大变化,并且呢强抗碰撞,我们呢几乎找不到两个不一样的东西,不可能说诶12345它的MD5值是这个,12347MD5值还是这个,所以呢,我们不会得到这些东西,所以呢它是强抗碰撞的,那如果我们从MD5们将一个用户传来的铭文123456我们存数据库,我们存成了一串MD5我们放在这儿了,那有没有什么风险呢?我们说如果我们就这么来进行MD5保存,风险还是非常大的,来来看,网上随便呢,我们来搜索都有MD5破解,好,比如我们来破解一下,我们来这个MD5破解工具,网上呢非常多,比如我拿到我的这。
06:37
按MD5的密文,好,那这个秘文是这个,我让他呢查一下,诶得到结果123456,那确实是我们之前的铭文,那他为什么能做到破解,不是说我们这个MD5是不可逆的吗?对,是不可逆的,但是利用他的这个抗修改性比,就说只要动了一个,那就会发生变化,那相当于就是说只要是123456M第五值永远是不变的,所以呢,我们就会有一种叫彩虹表,这彩虹表呢,就是利用暴力破解,怎么个暴力破解法?
07:12
我们可以这么来做,比如我现在呢,就是这个网站,我的破解网站,我网站呢,我每天的电脑没事儿,我就天天计算各种值的MD5,我存到数据库里边,我给数据库里边存了123456,它的MD5是什么什么。123456比如我们保存了它的MD5是什么?我们保存了234567,它的MD5是什么什么?而且呢,我们每天都大量更新很多数据,接下来呢,突然有一个人拿到了这个密文,想要知道铭文,那么就去数据库看这一串密文,等于我们后边的那就能匹配到铭文了,那这就是一个暴力破解,所以呢,我们MD5不能直接用来存储密码,MD5不能用这个直接进行密码的加密存储,那么应该还来做一件事,就是我们接下来说的进阶一下叫颜值加密,什么叫颜值加密?那在这个颜值加密之前,大家可能会有疑问,那为什么我们都知道这是MD5加密,它就不能可逆出来我们的铭文呢?
08:19
原因是这样子的,我们举一个现实中比较切合实际的例子,大家考虑一下这个算法的内容呢,我就不详说了,那例子呢,比如我们现在有一头牛,那送给了这个屠宰场,那接下来屠宰场呢,把我们这头牛杀了给我们,将所有的牛肉交给我们,但是与此同时,屠宰场里边还杀了很多的牛,你能不能端出一盘牛肉,你来判断这盘牛肉是屠宰场哪个牛杀的呢?所以呢,我们现在这个由于MD5是一个消息摘要,它会损失原数据,所以呢,我们不能通过最终打散的这个MD5值,最终计算的这个MD5值推断出我们这个原数据是什么,这就是一个比较形象的例子,我们这个颜值加密,因为MD5呢,我们不能进行直接存储,直接存储呢,容易被暴力破解,所以我们使用一种叫颜值加密,颜值加密是什么?同样的,我们。
09:19
那也有一个工具,我们叫MD5,诶有一个工具是还是我们这个comments里边有个MD5,诶,那就是我们这个加密工具,它里边呢有一个方法叫MD5加密,加密的时候呢,我们可以传一个密文,也可以传一个颜值,这个就相当于假设我们做的这个饭,我们是用MD做出来了,只要是同一个材料做出的饭都一样,那这样呢,每一个人去来尝这个饭,口味不一样,但是我随机的给里边撒一把盐,那它的这个轻重度就不一样了,所有的味道就都不一样了,所以我们这个加密的时候,可以给它进行一个随机值。
10:01
比如你给我传过来的是123456,那我在加密的时候呢,我再来把123456这个当前值,我来拼上一个系统当前时间,哎,我得到一个最终的值,我再来进行MD5加密,那呢,你就可能不容易破解了,但是这样做的缺点就是,那我们怎么知道我的这个存储的这个密文,它是123456加了我系统时间,最终得到的我们的密文,用户呢,如果页面提交了123456,我们怎么知道用户提交的密码是正确的,所以我们相当于得知道我们当时给123456这个用户存的时候,我给他加的这个随机,也就是我们这个当前系统时间到底是多少,那为了知道呢,我们就需要给数据库这张表里边再设计一个字段,比如我们就叫随机时间这个字段呢,我们保存了当时我给你用的这个时间值是多少,那你数据库页面给我提交了123。
11:01
五六把这个字段的值拼上,我再给你MD51加密,那就会得到我们最终上一次加密的真正内容,这相当于密码就匹配了,所以说呢,我们这个颜值就类似于这种原理,那我们来给大家测一下这个颜值加密,它里边呢有一个方法,MD5加密,然后加密呢,我们来传一个字符串,比如123456.1个get。好,我们现在拿到它,我们也不用传颜值,它这一块呢,我们给大家看它这一块方法的解释,我们这个呢,传一个我们要进行哈希这个MD5哈希计算的这个铭文,然后呢,它会有一个默认颜值,默认颜值相当于得到一个随机的八位字符和一个前缀,前缀就是这个DOLLAR1DOLLAR这是一个前缀,所以呢,它的相当于给我们加的这个盐,我们称为加的这个随机我们就称为加盐,加的这个盐呢是DO1加上我们这个八位字符,八位字符它默认呢也都有八位字符,当然我们如果有了这种颜值加密,我们来看一下我们现在来得到的123456是不是每次都一样呢?来看一下S1得到这个值,我们就把原来的MD五行,我们也放在这。
12:17
走好,我们发现呢,这个123456,现在得到的值呢,是我们这一串,这是我们的颜值加密得到的值,那如果我们每次都来运行,因为他每次都给的是一个随机颜,但如果我们给一个我们指定的颜,比如我们的颜值,他说必须有一个前缀再加八位字符,好我们八位字符就是QQQQ我们来写上八个。好,假设呢,这就是我们八位字符,然后我们来进行加密走,所以呢,我看到得到结果就是这样,诶颜值呢在前边,后边呢是内容,这是我们得到的颜值加密的最终内容,如果我们把它存到数据库里边,比如把它呢存到数据库了,下次用户带了一个铭文页面,用户肯定是输入铭文123456,我们怎么知道用户输的这个铭文密码是对的,我们就得验证,我们这个对密码的验证,我们就应该是这样验证,由于我们是不可逆的,我们不可能拿到这个东西来进行解密,所以我们验证呢,就是把用户的这个铭文再来加密一次,把它进行加密,但是进行加密的时候呢,我们当时给他传了一个随机言,要么接下来就得在数据库里边保存一下我们当时传的随机言,要不然颜不一样,得到的内容都不一样,我们看之前用的默认颜迟,它是这样,然后呢,我们现在改了一个颜值,它就变成这样了。
13:40
而且呢,当我们这个颜值不动的情况下,如果我们颜值都一样,来看一下这个效果,那在这来做一个测试,如果颜值一样的情况下,得到密文是否一样呢?好,我们发现这个颜值一样的情况下,我们得到的第二次的这个秘闻跟我们之前的这个秘闻,诶是一模一样的,所以只要是颜值一样,我们知道当时撒的这把盐是什么,那我们就能得到最终的这个密文,所以呢,我们一般将123456再来进行颜值加密,进行颜值加密,而我们这个颜值加密以后呢,我们这个颜值是多少,这个颜值就要拿到数据库去数据库查,所以我们就必须在数据库里边维护一个延迟字段,我们当时这个用户在保存这个密码的时候,我们给他随机延迟多少,你就得保存,这样呢们去来验证的时候,用户123456带过来,好把它的这个延值也取出来,重新加密,得到这个跟我数据库上一次保存的这个一模一样,那说明用户提交的密码就是对的,但是呢,我们发现我们如果额外再来引入数据库里边加盐挺麻烦的,所以呢,接下来spring加呢,又。
14:52
有一个非常好用的工具,还是基于我们这个颜值加密,此家呢有一个叫be corporateate,我们的这个password incoder,我们一听这个东西呢,就叫我们的密码加密器来编码器,那么就来写一个new,那要使用它呢,我们来创建出这个对象,这个呢就是我们的密码的编码器,这个编码器呢们拿过来,他都帮我们封装好了,比如我们来硬扣的,现在编码一个值,比如页面给我们传来了123456。
15:21
走,这是页面传来的123456来看它对123456进行编码以后得到的最终结果,好,我们发现呢,123456得到的结果是这样,而且呢,123456这个结果会不会每次都是这个是固定的,如果是固定的又会被爆破,所以我们再来测试一下,我们第二次再让它进行加密,准确来说这是一次编码操作,好,然后呢,接下来我们又会得到这个,我发现呢,每次得到的东西呢都不一样,而且格式也都不一样。那接下来我们都不知道,我们当时他在加密的时候撒了这把盐是多少或者是什么。
16:01
那我们怎么进行验证,用户提交的这个123456,跟你数据库里边这个是一样的,我们就可以这样拿他的这个password code,他呢还有一个方法叫match方法,这match方法呢,传两个,一个呢是raw,就是原密码,那就是铭文密码,比如我叫123456,第二个呢,传入你数据库存的密文,那么数据库呢,比如123456,那多种加密呢,会加密出这多种结果,我随便来指定一种结果,我数据库呢存的是这个密文,然后我们来看它最终有没有匹配上。好们把这个是否匹配上,我们也打印一下走,我们来打印一下,好,我们来测试走,诶我们发现呢,提交的这个铭文123456跟这个秘文呢,它判断是匹配的,那这个密文是用的这个aw下面的能换成上面的。好,我换成上边的。那么再来进行测试,走。那看能不能匹配,诶我们发现呢,它也是匹配的,相当于我们如果有1000多个用户,我们要进行注册,我们只要用这个密码加密器,即使他们都是123456,那在数据库存的呢都不一样,而且呢,我们想要匹配计算都能计算成功,能计算成功的原因就是它其实在这个密码里边早都融合了颜值是多少,它能自动解析出这个颜值,比如举一个例子,大家能看到前面都是DOLLAR2A dollar10dollar,那假设呢,这个十指的就是第十个字符,它们中间分割的呢,是一个我们的颜值,假设这两个二跟二之间分割的是一个颜值,假设这两个六跟六之间分割的是一个颜值,所以呢,它相当于能通过他的这个密文字符串自己能解析出这个颜值,也就是不用我们再去额外存储了。所以最终呢,密码保。
17:59
嗯,我们就来使用它。
18:01
我们从MD5演进到延值,最终演进到它,我们在数据库里边呢,也不需要额外再加当时的延值字段,我们直接用它存就行了,那存的时候呢,编码存结果,那最终我们登录的时候要匹配,那么就拿铭文跟密文进行匹配,看能不能成功,好,那接下来我们service的这一块密码存储就来使用它,而且它的使用也非常简单,什么时候用什么时候用,创建一个就行,我们就在这来。那么创建出它,然后呢,我们来进行进行加密,密码呢要存储,我们先来进行编码,把原密码那用户提交的原密码get password拿过来,最终得到编码后的密码,这就是我们要存的数据,好,然后呢,接下来还有其他的默认信息,这个默认信息呢,大家就可以都来一一设置了,这个我就不设置了,最终我们把关键信息设置完了以后,那给数据库里边保存用户。
19:04
这是我们说的密码加密,我们就以后使用spring加带的b cooper这个密码加密器,那下一节课我们来继续完善其他逻辑。
我来说两句