目录
今日良言:理性和激情是生活不可或缺的调味品
一、加盐加密
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.
然后将原始密码通过加盐加密,然后输入一个待验证的密码,进行比较:
密码输入错误,验证的代码:
输出结果:
密码输入正确,输出结果:
使用 Spring Security也可以进行加盐加密和解密
Spring Security 是一个基于 Spring 框架的安全性解决方案,它提供了一套完整的安全机制和 API,用于保护 Web 应用程序。Spring Security 可以帮助开发人员管理用户身份验证、授权和加密,以及防止跨站点请求伪造(CSRF)攻击等常见的 Web 安全问题。
具体步骤如下:
1).添加Sping Security 框架
将Spring Security 框架添加到项目中以后,此时启动项目,会发现,项目启动失败,并且出现一个登录界面,如下图:
这是因为,当添加 Spring Security 框架以后,会为当前项目添加上用户的认证和授权,此时就会跳转到 Spring Security 自己提供的登录页面。在控制台会提供用户名和密码帮助登录:
2).关闭Spring Security 认证
在SpingBoot 项目的启动类上添加如下注解,关闭Spring Security 自动的类加载:
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3).实现加盐加密和加盐解密的代码:
public class Exercise {
public static void main(String[] args) {
// 首先创建一个 对象
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String pw1 = "123456";
// 通过 encode 方法实现加盐加密
String finalPassword = passwordEncoder.encode(pw1);
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要验证的密码");
String ret = scanner.next();
// 通过matches 方法传入原始密码和加盐加密的到的密码进行比较
if (passwordEncoder.matches(ret,finalPassword)) {
System.out.println("密码正确");
} else {
System.out.println("密码错误");
}
}
}
输入错误密码进行验证,结果如下:
输入正确密码进行验证,结果如下:文章来源:https://www.toymoban.com/news/detail-464273.html
文章来源地址https://www.toymoban.com/news/detail-464273.html
到了这里,关于加盐加密——保障你的数据安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!