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

在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 {// 加密@Testpublic void encrypt() {String password = "123456";// Spring 提供的md5加密APIString 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);}
}

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

    // 验证@Testpublic 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请求和响应格式常见请求方法Header报头响应报文状态码URL
  • C语言-进程控制编程
  • ceph rgw 桶分片之reshard
  • The Sandbox 游戏制作教程第 6 章|如何使用装备制作出色的游戏 —— 避免环境危险
  • 数据库 - python操作MySQL
  • 【C语言】tcp接收服务
  • 使用 Spring Boot 实现 JWT 生成与验证的自定义类
  • Library介绍(三)
  • 二叉搜索树(c++版)
  • Qt多线程与数据库
  • MacOS升级Ruby版本详解:步骤、挑战与解决方案
  • 深度学习推理的技术实现与优化策略
  • ELK-03-skywalking监控linux系统
  • 新能源汽车储充机器人:能源高效与智能调度
  • STM32常见配置
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Docker 笔记(2):Dockerfile
  • JS学习笔记——闭包
  • mysql 5.6 原生Online DDL解析
  • React Native移动开发实战-3-实现页面间的数据传递
  • REST架构的思考
  • spring + angular 实现导出excel
  • Spring声明式事务管理之一:五大属性分析
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 好的网址,关于.net 4.0 ,vs 2010
  • 深入浏览器事件循环的本质
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #Linux(make工具和makefile文件以及makefile语法)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (12)Hive调优——count distinct去重优化
  • (5)STL算法之复制
  • (bean配置类的注解开发)学习Spring的第十三天
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (Java入门)抽象类,接口,内部类
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (备忘)Java Map 遍历
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (转)ABI是什么
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 6 redis操作类
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net IE10 _doPostBack 未定义
  • .Net 代码性能 - (1)
  • .NET 使用配置文件
  • .NET 中让 Task 支持带超时的异步等待
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @31省区市高考时间表来了,祝考试成功
  • @Async 异步注解使用
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [C++进阶篇]STL中vector的使用