随机盐值实现密码的加密与验证

近日,在做完博客系统的项目之后发现在进行用户登录的时候对于密码的防护性不够严谨,可能会存在密码的安全问题,故本文将介绍如何使用【随机盐值】来实现密码的加密与解密

一、加密 & 代码解读

  • 首先我们来看到的是第一种【加盐加密】的方法,即为直接传入密码随机产生盐值来进行加密
java 复制代码
/**
 * 加盐加密
 *
 * @param password 明文密码
 * @return 加盐加密的密码
 */
public static String encrypt(String password) {
    // 1.产生盐值
    String salt = UUID.randomUUID().toString().replace("-", "");
    // 2.使用MD5(盐值+明文密码)得到加密的密码
    String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
    // 3.将盐值和加密的密码共同返回(合并盐值和加密密码)
    String dbPassword = salt + "$" + finalPassword;
    return dbPassword;
}

接下去我们来细致地解读一下这个加盐算法

  1. 首先我们使用工具类UUID中的randomUUID()方法,根据所传入的两个参数随机产生一个盐值
java 复制代码
// 1.产生盐值
String salt = UUID.randomUUID().toString().replace("-", "");
  1. 然后我们则使用工具类DigestUtils中的md5DigestAsHex()方法将随机生成的盐值进行拼接然后得到最后的加密后的密码
java 复制代码
// 2.使用MD5(盐值+明文密码)得到加密的密码
String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
  1. 最后,此方法会将所得到的盐值和最后的密码进行返回
java 复制代码
// 3.将盐值和加密的密码共同返回(合并盐值和加密密码)
String dbPassword = salt + "$" + finalPassword;

  • 接下去我们再来看看另一种的加密算法,不仅是传递所需要加密的密码,盐值也需要一并地传入
java 复制代码
/**
 * 加盐加密
 *
 * @param password 明文密码
 * @param salt     可传递盐值
 * @return 加盐加密的密码
 */
public static String encrypt(String password, String salt) {
    // 1.使用(盐值+明文密码)得到加密的密码
    String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
    // 2.将盐值和加密的密码共同返回(合并盐值和加密密码)
    String dbPassword = salt + "$" + finalPassword;
    return dbPassword;
}

💬那既然已经传入了盐值salt,那么除去第一步的盐值生成,其他都是一样的

二、验证 & 代码解读

  • 以下是对于用户所传递进来的密码进行验证的过程
java 复制代码
/**
 * 验证加盐加密密码
 *
 * @param password   明文密码(不一定对,需要验证明文密码)
 * @param dbPassword 数据库存储的密码(包含:salt+$+加盐加密密码)
 * @return true=密码正确
 */
public static boolean decrypt(String password, String dbPassword) {
    boolean result = false;
    if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) &&
            dbPassword.length() == 65 && dbPassword.contains("$")) { // 参数正确
        // 1.得到盐值
        String[] passwrodArr = dbPassword.split("\$");
        // 1.1 盐值
        String salt = passwrodArr[0];
//            // 1.2 得到正确密码的加盐加密密码
//            String finalPassword = passwrodArr[1];
        // 2.生成验证密码的加盐加密密码
        String checkPassword = encrypt(password, salt);
        if (dbPassword.equals(checkPassword)) {
            result = true;
        }
    }
    return result;
}

我们马上来解读一下

  1. 首先我们要先来进行参数校验,要检查的就是这两个参数是否存在,并且要检查从数据库中所取到的加盐后密码长度是否== 65,而且是否包含字符"$"
java 复制代码
if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) &&
        dbPassword.length() == 65 && dbPassword.contains("$")) { // 参数正确
  1. 因为所存入数据库的finalPasswordsalt + "$" + finalPassword;,所以我们要通过split()来取出取出和这个盐值
java 复制代码
// 1.得到盐值
String[] passwrodArr = dbPassword.split("\$");
// 1.1 盐值
String salt = passwrodArr[0];
  1. 最后,当我们得到这个盐值后,对用户所传递进来的密码进行一样的加盐加密,将得到后的结果与数据库中的密码进行比较,如果相同的话则进行标记,最后我们通过result来进行观察
java 复制代码
// 2.生成验证密码的加盐加密密码
String checkPassword = encrypt(password, salt);
if (dbPassword.equals(checkPassword)) {
    result = true;
}

三、测试观察

最后我们通过实体的用户注册登录来进行一下测试,观察是否可以达到加密验证

  • 首先看到当前系统中总共有两个用户,分别是【admin】和【zhangsan】
  • 然后我们去注册一个用户名为:lisi,并且密码为ls123的用户
  • 然后我们就可以看到数据库中多了一条用户名为:lisi,并且密码为ls123的用户
  • 接着我们就可以去进行登录了,输入刚才所注册的用户名和密码就可以,我们一起来调试着看看
  • 然后便很成功地登录进去了
  • 我们可以再来试试输错密码的可能性。很明显当密码输错的时候在进行验证的时候就会识别到了

以上就是有关随机盐值实现密码的加密与验证,希望本文对您有所帮助🌹

相关推荐
K***43061 小时前
IDEA+Docker一键部署项目SpringBoot项目
spring boot·docker·intellij-idea
智慧医院运行管理解决方案专家4 小时前
医院安全管理优化首选:中科医信安全生产双重预防管理系统
安全·医院管理·医院智慧安全管理·平安医院·智慧医院后勤
世界尽头与你6 小时前
CVE-2022-46463 Harbor public 镜像仓库信息泄露
安全·网络安全·渗透测试
t***p9357 小时前
idea创建SpringBoot自动创建Lombok无效果(解决)
spring boot·后端·intellij-idea
d***81727 小时前
解决SpringBoot项目启动错误:找不到或无法加载主类
java·spring boot·后端
十里-7 小时前
前端监控1-数据上报
前端·安全
自不量力的A同学10 小时前
Spring Boot 4.0.0 正式发布
java·spring boot·后端
杭州泽沃电子科技有限公司11 小时前
在线监测:为医药精细化工奠定安全、合规与质量基石
运维·人工智能·物联网·安全·智能监测
GIS数据转换器11 小时前
GIS+大模型助力安全风险精细化管理
大数据·网络·人工智能·安全·无人机
普普通通的南瓜12 小时前
IP证书在关键信息基础设施安全防护中的实践与挑战
网络·数据库·网络协议·tcp/ip·安全·ssl