加盐加密——保障你的数据安全

目录

今日良言:理性和激情是生活不可或缺的调味品

一、加盐加密

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("密码错误");
        }
    }
}

输入错误密码进行验证,结果如下:

输入正确密码进行验证,结果如下:

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值