目录
今日良言:理性和激情是生活不可或缺的调味品
一、加盐加密
1.普通密码的缺点
2.什么是加盐加密
3.加盐加密的过程
4.加盐加密的实现
今日良言:理性和激情是生活不可或缺的调味品
一、加盐加密
1.普通密码的缺点
在介绍加盐加密之前,先想想为什么普通密码的缺点是什么?
普通的密码不安全是因为它们通常很容易被猜到或破解。一个简单的密码可能只包含数字、字母或符号中的几个,这使得攻击者可以通过暴力破解或字典攻击来尝试猜测密码。此外,如果用户使用相同的密码来保护多个账户,那么一旦其中一个账户被攻破,攻击者就可以访问所有受影响的账户。
密码安全的重要性不言而喻,所以说,如何提高用户密码的安全性就值得关注了。
通过加盐加密就可以提高密码的安全性。
2.什么是加盐加密
简单介绍一下什么是加盐加密:
密码加盐是一种增强密码安全性的方法,它将用户输入的明文密码与一个随机生成的字符串(称为盐)进行组合,形成一个新的密文密码。这个新的密文密码可以存储在数据库中,以便后续验证用户身份时使用。当用户输入密码时,应用程序会将密码与盐进行组合,然后再使用该组合来计算哈希值或摘要值。这样即使攻击者获取了加密后的密码,也无法直接还原出原始的明文密码。因为攻击者必须先破解哈希值或摘要值才能获取原始的密码。通过使用密码加盐技术,可以有效地提高密码的安全性,避免因为密码泄露而导致的安全问题。
虽然进行加盐加密以后,密码安全性会提高,但是密码也不是绝对安全的,但是随着密码安全性的提高,破解成本也会提高,所以使用加盐加密还是非常有必要的。
3.加盐加密的过程
加盐加密的过程简单来说,可以分为以下三步:
1).用户输入明文密码,生成随机盐值。
2).使用md5,通过明文密码+盐值生成最终密码。
3).将随机盐值+自定义拼接规则+ 最终密码存入数据库。
加盐解密的过程简单来说,可以分为以下四步:
1).输入待检验的密码和数据库中的最终密码。
2).先进行参数检验。
3).通过自定义拼接规则,将最终密码分割成两部分(随机盐值+明文密码)。
4).验证分割得到的明文密码和待检验的密码是否相等。
4.加盐加密的实现
加盐加密和加盐解密的代码如下:
/**
* 加盐加密
* @param password 初始密码
* @return 加盐密码
*/
public static String encrypt(String password) {
// 1.生成随机盐值
// 通过UUID生成唯一的数字作为随机盐值
String salt = UUID.randomUUID().toString().replace("-","");// 顺便去掉 -
// 2.根据初始密码 和 随机盐值 通过md5生成 加盐加密的密码
// StandardCharsets.UTF_8 设置编码格式
String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
// 3.将盐值 和 加盐加密得到的密码一起返回(合并盐值和加盐密码)
return salt +"$"+finalPassword;
}
/**
* 加盐加密的方法重载
* @param password 初始密码
* @return 加盐密码
*/
public static String encrypt(String password,String salt) {
// 2.根据初始密码 和 随机盐值 通过md5生成 加盐加密的密码
String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
// 3.将盐值 和 加盐加密得到的密码一起返回(合并盐值和加盐密码)
// 这里的"$"是自定义的拼接规则,用于区分随机盐值和明文密码
return salt +"$"+finalPassword;
}
/**
* 加盐解密
* @param password 初始密码
* @param dbPassword 数据库中的密码
* @return
*/
public static boolean decrypt(String password,String dbPassword) {
// 先进行参数判断
// StringUtils.hasLength() 是Spring提供的可以判断传入的字符串是否为空和长度是否为0
// 判端长度是否为65是因为:随机盐值是32位,通过md5生成的密码也是32位 $ 长度1位
if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword)
&& dbPassword.length() == 65 && dbPassword.contains("$")) {
// 分割数据库中的密码
String[] arr = dbPassword.split("\\$");
// 得到盐值
String salt = arr[0];
// 将盐值和初始密码传入重载的加盐加密的方法,生成新的密码
String finalPassword = encrypt(password,salt);
// 比较待验证的密码和明文密码是否相等
if (finalPassword.equals(dbPassword)) {
return true;
}
}
return false;
}
效果展示:
首先原始密码是:123456.
然后将原始密码通过加盐加密,然后输入一个待验证的密码,进行比较:
密码输入错误,验证的代码:
输出结果:
密码输入正确,输出结果:
以上就是加盐加密相关知识点。