密码加密

MD5

密码加密_第1张图片
image.png

code

package com.pl.gulimail.test;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.digest.Md5Crypt;
import org.junit.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 

* * @Description: TODO *

* @ClassName DecryptTest * @Author pl * @Date 2021/1/13 * @Version V1.0.0 */ @Slf4j public class DecryptTest { @Test public void md5Test(){ String md5Hex = DigestUtils.md5Hex("191151515"); log.info("加密后;"+md5Hex); } }

输出


image.png

notice:

n1.信息摘要算法

根据文本的特征值,得出一个固定长度的MD5值,这个文本只要有一个字节发生变化,这个MD5值就会随之变化(也就是抗修改性)。

n2.秒传:

百度网盘秒传功能,再上传之前算出文件的MD5值,并存储起来,当再次上传一个MD5时,如果匹配到一个相同的MD5则秒传。

n3.不可逆

不能通过一个MD5算出加密前的明文是什么,但是MD5是可以破解的,网上可以找到很多的MD5破解工具,这都利用了于MD5的抗修改性,因为固定的值MD5加密后也会得到一个固定的值,网上的破解工具实际上都是暴力破解,这些网站都有MD5对应的彩虹表,他们天天计算各种值的MD5,存到数据库中,通过MD5值去匹配其对应的明文。

n4.强抗碰撞

不同的值很难产生相同的MD5值。

所以综上可以看出MD5是无法直接用于加密的业务中,所以引出了MD5加盐算法。

MD5+盐


密码加密_第2张图片
image.png

code

package com.pl.gulimail.test;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.digest.Md5Crypt;
import org.junit.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 

* * @Description: TODO *

* @ClassName DecryptTest * @Author pl * @Date 2021/1/13 * @Version V1.0.0 */ @Slf4j public class DecryptTest { @Test public void md5SaltTest(){ String md5Crypt = Md5Crypt.md5Crypt("115415151".getBytes(), "$1$qqqqqqqqqq"); log.info(md5Crypt); } }

输出


image.png

如果不指定盐

Md5Crypt.md5Crypt("115415151".getBytes())

查看源码

密码加密_第3张图片
image.png

image.png

可以发现他的盐是 +8位随机数。

notice

n1.盐值加密

将文本MD5加密后,在MD5值的某个位置加上随机数与之组合。此时数据入库同时存储MD5和salt值,验证的时候只需要将明文MD5加密,和存储中去掉盐的密文比较是否相同即可。但是这么做也是有弊端的,需要每次都多存储一个值,即本次存储的盐。
所以MD5+盐在业务中使用也是有缺点的,那么有没有一种比较完美的加密方式呢?
也就引出了下面要说的,SpringSecurity安全框架提供的加密方式。

BCryptPasswordEncoder

这是SpringSecurity框架提供的一种加密方式,BCryptPasswordEncoder使用哈希算法+随机盐来对字符串加密。因为哈希是一种不可逆算法,所以密码认证时需要使用相同的算法+盐值来对待校验的明文进行加密,然后比较这两个密文来进行验证。BCryptPasswordEncoder在加密时通过从传入的salt中获取real_salt用来加密,保证了这一点。

同时这个组件最牛逼的一点他可以自适配你的加密方式,无论你用哪种加密方式都能通过他来匹配。
BCryptPasswordEncoder是通过PasswordEncoderFactories创建的,他支持多种加密方式,所以在单点登录中,无论接入的应用用户使用哪种加密方式,都可以通过BCryptPasswordEncoder进行明文和密文的匹配。


密码加密_第4张图片
image.png

code


package com.pl.gulimail.test;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 

* * @Description: TODO *

* @ClassName DecryptTest * @Author pl * @Date 2021/1/13 * @Version V1.0.0 */ @Slf4j public class DecryptTest { @Test public void securityTest(){ BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String encode = passwordEncoder.encode("12144124141"); log.info("加密后-----------:"+encode); boolean matches = passwordEncoder.matches("12144124141", "$2a$10$j.RJ8lXYkC7wXVQL1gEG7O0SLkQc6xudo0bx4hy5AaoD2nMx6S//a"); log.info("比较结果;"+matches); } }

输出


image.png

你可能感兴趣的:(密码加密)