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

密码算法简介

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

System.out.println(UUID.randomUUID());

打印示例:

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

二、MD5使用示例

2.1 得到密文

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

    /*** 得到密文*/@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解密校验

    /*** 解密*/@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.根据明文进行加密

    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密码校验

    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类

    @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.xdnf.cn/news/18095.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何用GPT-4o解读视频

OpenAI在去年推出的GPT-4V已经支持了多模态识别&#xff0c;但一直仅限于图片输入&#xff0c;不支持视频。相比之下&#xff0c;Google的Gemini早已支持视频识别。最近&#xff0c;我司业务场景中出现了一个需要识别视频的需求&#xff0c;而我们只采购了GPT-4o模型。这就引发…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

vim配置 --> 在创建的普通用户下

在目录/etc/ 下面&#xff0c;有个名为vimrc 的文件&#xff0c;这是系统中公共的vim配置文件对所有用户都有效 我们现在创建一个普通用户 dm 创建好以后&#xff0c;我们退出重新链接 再切换到普通用户下 再输入密码&#xff08;是不显示的&#xff0c;输入完后&#xff0c;…

Vue通过file控件上传文件到Node服务器

功能&#xff1a; 多文件同步上传、拖动上传、实时上传进度条、上传前的删除文件、原生file控件的美化 搁置的功能: 取消上传(上传过程中取消,即取消网络请求abort)、上传文件夹、大文件切片、以及很多限制条件未处理(重复上传、文件格式。。。) bug: 文件总大小(。。。竟然从d…

VScode学习前端-01

小问题合集&#xff1a; vscode按&#xff01;有时候没反应&#xff0c;有时候出来&#xff0c;是因为------>必须在英文状态下输入&#xff01; 把鼠标放在函数、变量等上面&#xff0c;会自动弹出提示&#xff0c;但挡住视线&#xff0c;有点不习惯。 打开file->pre…

Qwen2.5-3B-Instruct-GGUF部署

注册账号&#xff1a; 魔搭社区 等一会&#xff1a; 部署好了&#xff1a; 立即使用&#xff1a; 您部署的服务提供OpenAI API接口&#xff0c;可通过OpenAI SDK进行调用。请确保您的服务处于正常运行状态&#xff0c;并预先安装OpenAI SDK: pip install openai 在本地新建…

数据库管理-第262期 崖山:知其不可而为之(20241116)

数据库管理262期 2024-11-16 数据库管理-第262期 崖山&#xff1a;知其不可而为之&#xff08;20241116&#xff09;1 崖山之名2 绝地反击3 不止崖山总结 数据库管理-第262期 崖山&#xff1a;知其不可而为之&#xff08;20241116&#xff09; 作者&#xff1a;胖头鱼的鱼缸&am…

C语言:指针的变量运算及数组指针

1、指针的变量运算 指针变量保存的是地址&#xff0c;二地址本质上是一个整数&#xff0c;所以指针变量可以进行部分运算&#xff0c;列如加法减法、比较等&#xff0c;请看下面的代码&#xff1a; 1. #include <stdio.h> 2. 3. int main(){ 4. int a 10, *pa &a…

【高德地图】基本使用教程(玩转地图)(vue2+vue3)

简介 带大家一步步实现地图显示特定位置&#xff0c;或定位到当前位置。并且拖拽地图界面能够查询出指定位置周边的信息。通过关键字搜索周边信息。 本教程适合初学者。 一、获取使用高德api的key 打开高德开发平台&#xff0c;登录后&#xff0c;鼠标覆盖右上角头像&#…

统信UOS开发接口DTK

DTK(Development ToolKit)是基于 Qt 开发的简单且实用的通用开发框架。提供丰富的开发接口与支持工具,能有效提升开发效率。 文章目录 一、简介DTK 常见模块介绍概述二、框架创建开发环境准备使用 cmake三、常见模块窗口和对话框一、简介 DTK 常见模块介绍 概述 DTK(Dev…

转轮数组(C语言实现)

题目介绍 方法一我们可以先把数字1 2 3 4逆转一下&#xff0c;第二步我们可以逆转一下5 6 7&#xff0c; 最后整体逆置一下就会变成上面的数字。 void reverse(int* nums, int begin, int end) {while (begin < end){int tmp nums[begin];nums[begin] nums[end];nums[en…

云端弹性计算公式有哪些内容?

云端弹性计算公式有哪些内容&#xff1f;云端弹性计算公式涵盖资源分配、性能监控、自动伸缩及积分计算等方面。资源分配依据虚拟机配置和实际需求动态调整&#xff1b;性能监控实时监控CPU、内存等关键指标&#xff1b;自动伸缩根据预设阈值自动调整虚拟机数量&#xff1b;积分…

openGauss常见问题与故障处理(四)

4.数据库故障定位手段&#xff1a; 数据库故障定位手段通常有如下三种类&#xff1a; 提到“种类”&#xff0c;这里给大家举一个模拟场景中肖荏盖反向的小故事 对于初学者入门的学习&#xff0c;一些理论不容易理解或记住&#xff0c;所以本节课程【创新】采用了【正、反对比…

《Structure-from-Motion Revisited》论文解析——COLMAP

一、论文简介 这篇论文的标题是《Structure-from-Motion Revisited》&#xff0c;作者是Johannes L. Schnberger和Jan-Michael Frahm&#xff0c;分别来自北卡罗来纳大学教堂山分校和苏黎世联邦理工学院。这篇论文主要讨论了一种新的增量式结构从运动&#xff08;Structure-fro…

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日&#xff0c;渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人&#xff0c;莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院&#xff08;庚贤堂中医药…

Cherno OpenGL(18 ~ 24)

混合 默认情况下 OpenGL 不执行任何混合&#xff0c;它只需要你们渲染的东西&#xff0c;然后把它渲染成不透明的东西。 之前我们渲染了红色方块&#xff0c;在它上面我们以某种形式渲染了一个半透明的蓝色方块&#xff08;不透明的蓝色方块会直接覆盖红色方块&#xff09;&am…

HashMap源码分析下

HashMap 环境 JDK11 HashMap是用哈希表结构&#xff08;链表散列&#xff1a;数组链表&#xff09;实现&#xff0c;结合数组和链表的优点。扩容时当链表长度超过 6 时&#xff0c;链表转换为红黑树。 public class HashMap<K,V> extends AbstractMap<K,V>impleme…

【Golang】——Gin 框架简介与安装

文章目录 1. Gin 框架概述1.1 什么是 Gin 框架&#xff1f;1.2 为什么选择 Gin&#xff1f;1.3 使用场景 2. 安装 Go 与 Gin 框架2.1 安装 Go 语言环境2.2 初始化 Go 项目2.3 安装 Gin 框架 3. 编写第一个 Gin 应用3.1 Gin 最小化示例代码代码解读3.2 运行程序3.3 测试服务 4. …

南京邮电大学《智能控制技术》期末抢救(上)

一、智能控制的提出 传统控制方法包括经典控制和现代控制——基于被控对象精确模型的控制方式&#xff0c;缺乏灵活性和应变能力&#xff0c;适于解决线性、时不变性等相对简单的控制问题。传统控制方法在实际应用中遇到很多难解决的问题&#xff0c;主要表现以下几点&#xff…