【SpringBoot 项目 加密】你会对Spring项目的接口进行加密吗?

这里写目录标题

    • 加密/加盐
      • 加密介绍
        • 加密算法分类
        • 加密思路
      • 测试类
      • 写加密/解密工具类
      • 修改数据库密码
      • 修改登录接口

加密/加盐

加密介绍

在MySQL数据库中, 我们常常需要对密码, ⾝份证号, ⼿机号等敏感信息进⾏加密, 以保证数据的安全性。如果使⽤明⽂存储, 当⿊客⼊侵了数据库时, 就可以轻松获取到用户的相关信息, 从⽽对用户或者企业造成信息泄漏或者财产损失。
⽬前我们用户的密码还是明⽂设置的, 为了保护用户的密码信息, 我们需要对密码进⾏加密。

加密算法分类

密码算法主要分为三类: 对称密码算法, ⾮对称密码算法, 摘要算法
image.png

  1. 对称密码算法:是指加密密钥和解密密钥相同的密码算法。常⻅的对称密码算法有: AES, DES, 3DES,RC4, RC5, RC6 等。
  2. ⾮对称密码算法:是指加密密钥和解密密钥不同的密码算法. 该算法使⽤⼀个密钥(公钥)进⾏加密, ⽤另外⼀个密钥(私钥)进⾏解密
  • 加密密钥可以公开,⼜称为公钥
  • 解密密钥必须保密,⼜称为私钥
    常⻅的⾮对称密码算法有: RSA, DSA, ECDSA, ECC 等
  1. 摘要算法:是指把任意⻓度的输⼊消息数据转化为固定⻓度的输出数据的⼀种密码算法。摘要算法是不可逆的, 也就是无法解密。通常⽤来检验数据的完整性的重要技术, 即对数据进⾏哈希计算然后⽐较摘要值, 判断是否⼀致。常⻅的摘要算法有: MD5, SHA系列(SHA1, SHA2等), CRC(CRC8, CRC16,CRC32)
加密思路

博客系统中, 我们采⽤MD5算法来进⾏加密。

  1. MD5如何加密?

摘要算法:同样的明文经过同样的摘要算法,得到的结果是一样的。
验证方法:验证经过摘要算法处理之后的结果,如果密文一样,那么就认为明文是一样的。
(1)数据库存储的一定是密文
(2)用户输入的一定是明文
(3)把用户输入的明文,经过MD5处理之后,和数据库的密文进行比对,结果一样,就认为正确
虽然经过MD5加密后的密⽂⽆法解密, 但由于相同的字符串经过MD5加密之后的密文是相同的, 当存储用户密码的数据库泄露后, 攻击者会很容易便能找到相同密码的用户, 从⽽降低了破解密码的难度。因此, 在对用户密码进⾏加密时,需要考虑对密码进⾏包装, 即使是相同的密码, 也保存为不同的密文。即使用户输⼊的是弱密码, 也考虑进⾏增强, 从⽽增加密码被攻破的难度。

  1. 加入随机盐值

采⽤为⼀个密码拼接⼀个随机字符来进⾏加密, 这个随机字符我们称之为""。假如有⼀个加盐后的加密串,⿊客通过⼀定手段破解这个加密串, 他拿到的明⽂并不是我们加密前的字符串, ⽽是加密前的字符串和盐组合的字符串, 这样相对来说⼜增加了字符串的安全性。
image.png
明文+随机盐值=复杂的明文----->进行MD5加密------>密文

  1. 在随机盐值的基础上,如何验证?

加密逻辑:明文+随机盐值,进行MD5加密,得到密文
数据库中存储的是:加密之后的密文随机盐值
验证逻辑:待验证的明文+这个随机盐值,进行MD5加密,和数据库的密文进行对比

  1. 具体实现流程:

用户注册:

  1. 生成随机盐值
  2. 用户的明文密码+随机盐值,通过MD5进行加密
  3. 保存随机盐值密文

用户登录(校验)

  1. 获取用户注册时的随机盐值
  2. 待验证的明文+第一步的随机盐值,通过MD5进行加密
  3. 判断第二步的密文和用户注册时数据库中存的密文是否相同

测试类

public class SecurityUtilsTest {// 加密@Testpublic void encrypt() {String password = "123456";// 明文String md5Str = DigestUtils.md5DigestAsHex(password.getBytes());// 对明文进行MD5加密System.out.println(md5Str);String salt = UUID.randomUUID().toString().replace("-", "");// 生成随机盐值System.out.println(salt);// (salt+明文)-->MD5加密,得到密文String securityPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());// 密文// 数据库存储的是:salt+密文String finalPassword = salt+securityPassword;System.out.println(finalPassword);}
}

运行程序,观察结果:
image.png
再次运行程序,会发现:相同的明文,经过加密之后,每次的密文都不相同:
image.png

@Test
public void verify() {String inputPassword = "123456";// 用户输入的明文// 数据库存储的信息:salt + MD5(salt+明文)String sqlPassword = "a0bda3270f254be0af20a86787f1ae6e4c791fde602e8207e08fd3f38df178cf";if (sqlPassword == null || sqlPassword.length() != 64) {System.out.println("校验失败");}String salt = sqlPassword.substring(0,32);// 拿盐值:数据库存储的前32位// MD5(salt+用户输入的明文)String secretPassword = DigestUtils.md5DigestAsHex((salt+inputPassword).getBytes());String finalPassword = salt+secretPassword;//最终的密文if (finalPassword.equals(sqlPassword)) {System.out.println("校验成功");} else {System.out.println("校验失败");}
}

运行程序,验证结果:
image.png
重新生成一个密文,继续校验:
image.png
image.png
运行结果:
image.png

写加密/解密工具类

@Slf4j
public class SecurityUtils {// 加密public static String encrypt(String password) {String salt = UUID.randomUUID().toString().replace("-", "");// 盐值String securityPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());// 密文String finalPassword = salt + securityPassword;// 存储在数据库中:salt + MD5(salt+明文)return finalPassword;}// 校验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;
//        }
//        log.error("校验失败");
//        return false;return finalPassword.equals(sqlPassword);}
}

修改数据库密码

数据库中的原始密码:
image.png
⽤测试类给密码123456⽣成密⽂:
846cc0edb8ea43c09f4fe8c1eef45b567c27e95c15f112417f0b27d098d14db7
7b5bd4825a5e461eb7be1128ff7033ff2c1ac41cec671b4a6bd3e2739b45ebed
修改数据库明⽂密码为密⽂, 执行SQL

update user set
password='846cc0edb8ea43c09f4fe8c1eef45b567c27e95c15f112417f0b27d098d14db7'
where id=1;update user set
password='7b5bd4825a5e461eb7be1128ff7033ff2c1ac41cec671b4a6bd3e2739b45ebed'
where id=2;

image.png

修改登录接口

修改UserController中登录接口密码校验的逻辑:
image.png
启动程序,访问http://127.0.0.1:8080/blog_login.html,进行登录验证:
image.png
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3019834.html

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

相关文章

添砖Java之路其一——Java跨平台原理,JRE与JDK(为什么要安装)。

目录 前言: Java跨平台工作原理简单的理解: JRE与JDK: 前言: 最近又开始学Java了,所以又开一个板块来记录我Java的笔记。 Java跨平台工作原理简单的理解: 简单概括:简单来说Java跨平台原理…

I.MX6U NXP参考手册中“IPG“的含义

前言: 本文记录了在学习正点原子 I.MX6UAPLHA/Mini开发板中,在NXP参考手册中遇到的缩写术语 "IPG" 的含义。 引用: Solved: Whats IP Bus Means - NXP Community Solved: IPG/PER clocks - NXP Community 正文: 1. …

BS-Diff | 扩散模型在骨抑制任务上的首次登场!

摘要 胸部 X 射线(CXR)是肺部筛查中常用的低剂量方式。然而,由于大约 75% 的肺部区域与骨骼重叠,这反过来又阻碍了疾病的检测和诊断,因此 CXR 的功效受到了一定程度的影响。作为一种补救措施,骨抑制技术已…

Python程序中温度更新出现振荡问题的分析和解决方案

在处理温度更新出现振荡问题时,可以考虑以下分析和解决方案:检查温度更新算法是否正确,可能存在错误导致振荡。检查温度更新的步长(时间步长)是否合适,步长过大可能导致振荡。检查系统动力学模型是否准确&a…

北交所佣金费率标准是多少?北交所相关信息科普

北交所的佣金费率并非固定不变,而是可以根据投资者的需求和证券公司的政策进行调整。目前北交所的佣金费率最低是万分之二。 一般来说,北交所的佣金费率默认在万分之三左右,但这不是固定的费率。根据证券公司的不同,佣金费率可以…

01-基本概念- 索引,文档和 REST API

# kibana_sample_data_ecommerce 为es 索引#查看索引相关信息 GET kibana_sample_data_ecommerce#查看索引的文档总数 GET kibana_sample_data_ecommerce/_count#查看前10条文档,了解文档格式 POST kibana_sample_data_ecommerce/_search { }#_cat indices API #查看…

【翻译】Processing系列|(四)用 Android Studio 从 0 到 1 进行 Processing 安卓开发

原文链接:Processing for Android Developing with Android Studio 朋友跟我说官方教程里也写了该怎么用 Android Studio 开发,并且亲测可行。这种方式确实能开发出结构更加清晰、额外组件更加少的程序,比上一篇文章中直接克隆 Processing-An…

社交媒体数据恢复:多闪

社交软件多闪是一款深受用户喜爱的社交应用,用于与朋友、家人保持联系。有时,多闪软件的聊天记录可能会丢失或被删除,这时用户需要进行数据恢复。本文将详细介绍多闪软件聊天记录的恢复过程。 一、多闪软件聊天记录恢复方法 从手机备份中恢…

Docker 容器中 PHP 使用 Curl 访问本地服务异常

在 Docker 环境中,将应用程序和服务容器化是常见的做法,但是有时会遇到一些网络通信方面的问题。其中一个常见的问题是 PHP 容器无法使用 Curl 访问本地服务,这可能导致开发和调试过程中的困扰。 问题描述 通常情况下,我们会将 …

PCIE协议-1

1. PCIe结构拓扑 一个结构由点对点的链路组成,这些链路将一组组件互相连接 - 图1-2展示了一个结构拓扑示例。该图展示了一个称为层级结构的单一结构实例,由一个根复合体(Root Complex, RC)、多个端点(I/O设备&#xf…

Failed to build flash-attn:ERROR: Could not build wheels for flash-attn

安装 FlashAttention 的时候遇到报错: Failed to build flash-attn ERROR: Could not build wheels for flash-attn, which is required to install pyproject.toml-based projects可能是安装的版本与环境存在冲突吧,我的环境是: python 3.1…

vector、heap数组、stack数组访问性能验证

测试目的 本次测试旨在比较不同数据结构(vector、数组)以及不同访问方法([]、at()、offset)在性能上的差异,从而为开发者提供在特定情境下做出最佳选择的依据。 测试代码 测试网址:Quick C Benchmarks 使用GCC9.5 …

网盘应用:桌面端界面欣赏,这个赛道容不下小玩家。

网盘(Cloud Storage)是一种云存储服务,允许用户在互联网上存储、管理和共享文件。它提供了一个在线的虚拟硬盘,用户可以通过网络将文件上传到云端,并随时随地访问和管理这些文件。 阿里云盘

王道数据结构个人向笔记-第二章(线性表)

文章目录 2.1 线性表的定义和基本操作2.2 顺序表2.2.1 顺序表的定义2.2.2 顺序表的插入、删除(实现是基于静态分配)2.2.3 顺序表的查找 2.3 链表2.3.1 单链表的定义2.3.2 单链表的插入删除2.3.3 单链表的查找2.3.4 单链表的建立2.3.4 双链表2.3.5 循环链…

React18+TS+NestJS+GraphQL 全栈开发在线教育平台

高质量平台级应用流行全栈技术实用职场技巧通用面试策略React18TSNestJSGraphQL 全栈开发在线教育平台(完结) 黑石老师,大厂技术专家,深耕前后端十多年。发现很多的前端同学都面临如下的职业困扰:没有能拿的出手的面试…

机器人系统ros2-开发实践07-将机器人的状态广播到 tf2(Python)

上个教程将静态坐标系广播到 tf2,基于这个基础原理这个教程将演示机器人的点位状态发布到tf2 1. 写入广播节点 我们首先创建源文件。转到learning_tf2_py我们在上一教程中创建的包。在src/learning_tf2_py/learning_tf2_py目录中输入以下命令来下载示例广播示例代码…

EXCEL数据快速上传至SAP透明表

文章目录 前言一、案例介绍/笔者需求二、备份数据三、数据处理转化 a.EXCEL转为TXT注意事项 b.EXCEL转为TXT 四、ABAP结合内表更新数据至透明表 a.代码实现 b.断点TXT上传至内表 c.查看上传结果 五、总结 前言 这篇文章…

OpenSPG docker 安装教程

文章目录 前言自述 一、OpenSPG1.介绍 二、安装步骤1.安装服务端2.客户端部署 前言 自述 我最近是想结合chatglm3-6b和知识图谱做一个垂直领域的技术规范的问答系统,过程中也遇到了很多困难,在模型微调上,在数据集收集整理上,在知…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Dial的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 输入类控件 | Dial的使用及说明 文章编号:Qt…

【intro】GraphSAGE

论文 https://arxiv.org/pdf/1706.02216 abstract 大图中节点的低维embedding已经被证明在各种预测任务中非常有用,然而,大多数现有的方法要求在embedding训练期间图中的所有节点都存在;这些先前的方法属于直推式(transductive&#xff09…