当前位置: 首页 > article >正文

在Spring项目中使用MD5对数据库加密

目录

  • 引入
  • 密码的算法:
  • MD5
  • 盐值:salt
  • 在Spring项目中引入该算法:

引入

在mysql数据库中,我们常常需要对密码,身份证,手机号等敏感信息进行加密,以保证数据的安全性,如果使用明文存储,当黑客入侵数据库时,就可以轻松获取到用户的相关信息,从而对用户或者企业造成信息泄露或者财产损失

密码的算法:

  • 对称密码算法

加密和解密是是一个
y = f(x) , f(x) = y

  • 非对称密码算法

使用公钥加密,私钥解密

  • 摘要算法

任意长度的数据转化为固定长度的输出数据的一种算法,摘要算法是不可逆的
常见的摘要算法:MD5.SHA系列,CRC

MD5

MD5对新手友好,我们这里介绍MD5对数据库加密:
MD5摘要算法,主要时校验使用,在网络中有很多MD5在线加密工具:菜鸟工具加密
在这里插入图片描述

MD5不可逆,那么如何解密呢?

同样的明文经过,同样的加密算法,得到的结果是一样的

验证方法:通过摘要算法处理后的结果,如果密文一样,那么就认为明文是一样的
在这里插入图片描述
既然这样的话,我们不能保证数据库中的数据安全,所以我们引入盐值

盐值:salt

你的密码非常简单,我给你加上一段:
明文 + salt = 复杂的明文
对这个复杂的明文进行MD5加密

(这个盐值相对复杂)

在随机盐值的基础上,如何验证:

1.我们能拿到数据库的信息(加上随机盐值的密文)
2.待验证的明文
验证方式:
待验证的明文 + 这个随机盐值 ,进行MD5加密 ,和数据库的明文进行对比
这个随机验证:
用户注册时,把这个随机盐值存储下来
在这里插入图片描述

在Spring项目中引入该算法:

package com.example.chatroom;

import org.junit.jupiter.api.Test;
import org.springframework.util.DigestUtils;

import java.util.UUID;

public class SecurityUtilsTest {
    // 加密
    @Test
    public void encrypt() {
        String password = "123456";
        // Spring 提供的md5加密API
        String md5Str = DigestUtils.md5DigestAsHex(password.getBytes());
        System.out.println(md5Str);
        // 盐值
        // JDK提供的 UUID 生成永远不会系统的随机值
//        String salt0 = String.valueOf(UUID.randomUUID());
//        System.out.println(salt0);
        // 这里生产的 UUID 带有 “-” 这里把 “ - ” 替换
        String salt = UUID.randomUUID().toString().replace("-","");
        System.out.println(salt);
        // 加密后的信息: 盐值 + 明文 拼接的字符串 进行加密
        String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // salt + 密文 存储在数据库中
        String finalPassword = salt + securityPassword;
        System.out.println(finalPassword);
    }
}

运行结果:
在这里插入图片描述
验证:

    // 验证

    @Test
    public void verify(String inputPassword,String sqlPassword) {
        // sqlPassword : salt  +  md5(salt_password)
        //第一步先判断 长度
        if(sqlPassword == null || sqlPassword.length() != 64) {
            System.out.println("校验失败");
        }
        String salt = sqlPassword.substring(0,32);
        String secretPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes());
        String finalPassword = salt + secretPassword;
        if(finalPassword.equals(sqlPassword)){
            System.out.println("验证成功");
        }else {
            System.out.println("验证失败");
        }
    }

项目设计:
注册:

  • 生成随机盐值
  • 用户明文密码 + 随机盐值,通过MD5进行加密
  • 保存随机盐值,和密文

登录(校验):

  • 获取用户注册的随机盐值
  • 待验证的明文 + 第一步的随机盐值,通过MD5加密
  • 通过MD5加密后的密文和用户注册时数据库中存的密文是否一样
package com.example.chatroom.Utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;

import java.util.UUID;
@Slf4j
public class SecurityUtils {
    /**
     * 根据密文加密
     * @param password
     * @return
     */
    public static String encrypt(String password) {
        String md5Str = DigestUtils.md5DigestAsHex(password.getBytes());
        String salt = UUID.randomUUID().toString().replace("-","");
        String securityPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
        return securityPassword;
    }

    /**
     * 密码校验
     * @param inputPassword
     * @param sqlPassword
     * @return
     */
    public static boolean verify(String inputPassword,String sqlPassword) {
        if(sqlPassword == null || sqlPassword.length() != 64){
            log.error("数据库中的密码格式不对!");
            return false;
        }
        String salt = sqlPassword.substring(0,32);
        String secretPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes());
        String finalPassword = salt + secretPassword;
//        if(finalPassword.equals(sqlPassword)) {
//            return true;
//        }else {
//            return false;
//        }
        return finalPassword.equals(sqlPassword);
    }
}

在这里插入图片描述


http://www.kler.cn/news/324916.html

相关文章:

  • QT中基于QMatrix4x4与QVector3D的三维坐标变换类实现
  • 理想汽车使用无仪表盘设计的原因和弊端
  • 传统行业选择企业大文件传输系统需要注意哪些?
  • 【C语言刷力扣】2079.给植物浇水
  • 关于MATLAB计算3维图的向量夹角总是不正确的问题记录
  • 金融加密机的定义与功能
  • 【RabbitMQ——SpringBoot整合】
  • 少帅进行曲
  • 模拟实现(优先级队列)priority_queue:优先级队列、仿函数、 反向迭代器等的介绍
  • 再见 ESNI,你好 ECH!—— ECH的前世今生
  • 负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。
  • Elasticsearch实战应用:构建高效搜索引擎
  • vue 同一个页面第二次跳转路由内容不更新
  • SQL常用数据过滤 - EXISTS运算符
  • 基于SpringBoot校园失物招领系统设计与实现
  • 职业技能大赛-单元测试笔记分享
  • Git GUI操作流程
  • 使用Spring Cloud Config和JCE加密配置文件的实战教程
  • 新版Android Studio Koala 导入github第三方依赖 maven仓库的处理方法 (java版)
  • 云端融合,远程监控:EasyCVR工地无线安防监控系统的云解决方案
  • 故障诊断 | 基于双路神经网络的滚动轴承故障诊断
  • dig和nmap的区别
  • Python 数据分析与可视化:从入门到实践
  • hbase之布隆过滤器
  • Jenkins入门:从搭建到部署第一个Springboot项目(踩坑记录)
  • 微服务-- Gateway服务网关
  • CNN-LSTM预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测
  • net Core aspx视图引擎 razor视图引擎
  • java:brew安装rabbitmq以及简单示例
  • 【项目】基于Linux和C++的动态在线视频点播系统设计