28.<Spring博客系统④(使用MD5摘要算法对数据库密码进行加密)>

ops/2024/11/18 10:14:59/

密码算法简介

1.对称加密算法:加密和解密算法一样

2.非对称加密算法:公钥加密、私钥解密

3.摘要算法:不能解密,不可逆

简单介绍了解一下:

一、对称密码算法

是指加密秘钥和解密秘钥相同的密码算法. 常见的对称密码算法有: AES, DES, 3DES,RC4, RC5, RC6 等.
二、非对称密码算法

是指加密秘钥和解密秘钥不同的密码算法. 该算法使⽤⼀个秘钥进行加密, 用另外一个秘钥进行解密.
加密秘钥可以公开,又称为 公钥
解密秘钥必须保密,又称为 私钥
常见的非对称密码算法有: RSA, DSA, ECDSA, ECC
三、摘要算法

1.任意长度的输入消息数据转化为固定长度的输出数据的一种密码算法.。

2.摘要算法是不可逆的, 也就是无法解密.。

通常用来检验数据的完整性的重要技术, 即对数据进行哈希计算然后比较摘要值,,判断是否一致。

常见的摘要算法有: MD5, SHA系列(SHA1, SHA2等), CRC(CRC8, CRC16,CRC32)

一、MD5摘要算法(非常简单的加密方式)

我们的博客系统采用摘要算法 MD5 进行操作。

其实严格来说摘要算法 主要是做校验使用。

明文  ->  摘要算法 → 另外字符串

接收到的明文  ->  摘要算法 → 另外字符串

如果两个字符串相等。救认为接收到的明文是正确的。

特点 

1.不可逆

2.不同长度的字符串,经过MD5之后。得到字符串长度相同。

3.相同的字符串,经过MD5处理后。得到的字符串是相同的。(无论什么语言、什么平台实现)

有些网站会对MD5解密。(对于简单字符串)

因此我们在原始明文密码上。加上一个随机的盐值(相对复杂)。之后(明文+盐值)这个字符串就无法进行解密了。

盐值(salt)

盐值:就是相对复杂的字符串。

加密逻辑:明文 + 盐值 = 复杂的明文  再通过MD5进行加密 → 得到密文

校验逻辑:

(用户输入的明文+盐值) 通过MD5进行加密   →   得到密文

如果这两个密文相同。就认为用户输入的明文和注册时的明文密码是相同的。

数据库需要保存 :盐值和密文

验证方式:

待验证的明文+这个随机盐值,进行MD5加密。和数据库的密文进行对比。

实现步骤:

一、用户注册

1.生成随机盐值

2.用户明文密码+随机盐值,通过MD5进行加密。

3.保存 随机盐值 和密文。

二、用户登录

1.获取用户注册时的随机盐值

2.待验证的明文+第一步的随机盐值,通过MD5进行加密

3.判断第二步的密文和用户注册时数据库中存的密文是否一样。

UUID

不会重复

通常是和userId对应。但并不完全。

UUID是根据设备来的。

一个userId可能有多个UUID

java">System.out.println(UUID.randomUUID());

打印示例:

3c7719cd-b790-40c8-abb9-49a5545574dd

二、MD5使用示例

2.1 得到密文

数据库中存储(盐值+密文)

java">    /*** 得到密文*/@Testpublic void encrypt(){String password = "123456";//明文String md5Str = DigestUtils.md5DigestAsHex(password.getBytes());//对字符串 password 进行 MD5 加密//并将结果转换为一个 32 位的十六进制字符串//将字符串 password 转换为字节数组。System.out.println(md5Str);String salt = UUID.randomUUID().toString().replace("-","");System.out.println(salt);//得到盐值// .toString(): 将UUID 转换为字符串。//.replace("-", ""):去掉字符串中的所有连字符(-),使生成的盐值成为一个连续的字符串。String securityPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());//得到密文String finalPassword = salt +securityPassword;System.out.println(finalPassword);//最终数据库存储的内容}

 2.2解密校验

java">    /*** 解密*/@Testpublic void verify(){String inputPassword ="123456";String sqlPassword = "587bd5b3bf7f42ca9e0bce3da50e516f9096e954d0eb8ff2bd68e8b87c49afc6";//sqlPassword 是 salt + md5(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 findPassword = salt +secretPassword;if(findPassword.equals(sqlPassword)){System.out.println("校验成功");}else {System.out.println("校验失败!");}}

三、将MD5加密应用到博客系统

在utils包中创建SecurityUtils类 

3.1.根据明文进行加密

java">    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 salt+securityPassword;}

3.2密码校验

java">    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());return sqlPassword.equals(salt+secretPassword);}

 3.3更改UserController类

java">    @RequestMapping("/login")public Result login(String userName, String password){//1.参数校验//2.对密码进行校验//3.如果校验成功,生成tokenif(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){return Result.fail("用户名或密码不能为空!");}UserInfo userInfo = userService.queryUserByName(userName);if(userInfo == null || userInfo.getId() <= 0){return Result.fail("用户不存在");}
//        if(!password.equals(userInfo.getPassword())){
//            return Result.fail("密码错误!");
//        }if(!SecurityUtils.verify(password,userInfo.getPassword())){return Result.fail("密码错误!");}//密码正确Map<String,Object> claim = new HashMap<>();claim.put(Constant.USER_CLAIM_Id,userInfo.getId());claim.put(Constant.USER_CLAIM_NAME,userInfo.getUserName());return Result.success(JWTUtils.gentToken(claim));}

3.4修改数据库中的密码

通过之前测试类中我们生成的findPassword。将他替换数据库中的密码。

密码都是123456。

但是在数据库中,我们是看不出来的

 常见错误:

1.加密和校验的逻辑不一样。

数据库中存储的信息是(盐值+md5(salt+明文))。

注意 盐值 和 密文的 顺序。

2.数据库忘了修改密码

3.数据库中只存储了加密后的信息


http://www.ppmy.cn/ops/134675.html

相关文章

如何在算家云搭建Peach-9B-8k-Roleplay(文本生成)

一、Peach-9B-8k-Roleplay简介 Peach-9B-8k-Roleplay 是一种聊天大型语言模型&#xff0c;它是通过我们的数据合成方法创建的超过 100K 的对话中微调 01-ai/Yi-1.5-9B 模型而获得的。 也许是 34B 以下参数最好的 LLM。 二、模型搭建流程 1. 创建容器镜像 进入算家云平台的“…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

大数据CDP集群中ImpalaHive常见使用语法

1. SQL中设置常量 set var:pi_sysdate 20241114; Variable PI_SYSDATE set to 202411142. CDP中impala 创建内外表 #hive3.0 默认不创建事务表的配置参数 set default_transactional_typenone; create external table stg.hd_aml_mac_ip_ext (machinedate string,vc_fundacc…

求矩阵中最小元素及其位置

#include<stdio.h> int main() {int arr[3][3];for(int i0;i<3;i)//录入行{for(int j0;j<3;j)//录入列{scanf("%d",&arr[i][j]);}}int h,l;//定义行 列int minarr[0][0];//将二维数组首个元素定义为最小for(int i0;i<3;i)//遍历二维数组找到最小…

无人机+无人车+机器狗:城市巷战突破技术详解

在城市巷战中&#xff0c;无人机、无人车和机器狗的组合可以形成一种全新的战场突破技术&#xff0c;这种组合能够大幅提升作战效率&#xff0c;减少人员伤亡。以下是对这一技术的详细解析&#xff1a; 一、无人机的作用 1.空中侦察&#xff1a;无人机能够提供高空视角&#x…

vue3 查看word pdf excel文件

也是在网上找的基础上修改的 可以直接使用 npm install vue-office/docx npm install vue-office/excel npm install vue-office/pdf​<template><divclass"Office-Preview"v-loading"loading"element-loading-text"文件加载中...">…

2024.11|云计算行业的商业模式创新方法及实践

截至2024年&#xff0c;全球云计算行业已迈入一个全新的发展阶段。从基础设施即服务&#xff08;IaaS&#xff09;到基于人工智能的大规模模型平台&#xff0c;云计算技术的演变不仅改变了技术的内涵&#xff0c;也重新定义了商业模式。本文通过对全球最新技术进展的系统性分析…

ARM 汇编指令

blr指令的基本概念和用途 在 ARM64 汇编中&#xff0c;blr是 “Branch with Link to Register” 的缩写。它是一种分支指令&#xff0c;主要用于跳转到一个由寄存器指定的地址&#xff0c;并将返回地址保存到链接寄存器&#xff08;Link Register&#xff0c;LR&#xff09;中。…