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

news2024/11/25 5:53:22

这里写目录标题

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

加密/加盐

加密介绍

在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 {
    // 加密
    @Test
    public 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://www.coloradmin.cn/o/1652624.html

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

相关文章

springboot本地文件同步到nacos 本地文件上传到nacos 使用nacos

导入依赖 <!--配置文件使用nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>nacos版本</version></dependency><dependency…

深入解析Python中的`add_argument`用法

深入解析Python中的add_argument用法 在Python编程中&#xff0c;add_argument通常与命令行参数解析库argparse有关。这个库主要用于编写用户友好的命令行接口&#xff0c;其核心功能之一就是通过add_argument方法来指定程序可以接受哪些命令行参数。本篇博客将详细介绍argpar…

留学资讯 | 曼大突然官宣接受雅思单科重考!单科重考体验大揭秘!

雅思单科重考于昨日&#xff08;5月6日&#xff09;进行了大陆地区的首场考试&#xff0c;不少烤鸭都在观望状态&#xff0c;表示&#xff1a;虽然我很心动&#xff0c;但是学校们可不心动&#xff01;&#xff01; 别急&#xff01;好消息这不就来了&#xff01;曼大官网明确表…

geoHelper

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 GitHub - wnhyang/geoHelper 无奈何杨/geoHelper geoHelper整合了身份证、手机号、IP、GPS解析…

Java云商城系统 云端商城 一站式系统Java源码 云商城自助下单平台 云商城虚拟交易网

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 云商城系统&#xff0c;无后门&#xff0c;一站式系统Java源码&#xff0c;心权益商品数量不限数量 系统对接 手动发货 自动发货 兑 换 码 订单监控 商品监控 对象存储 邮箱提醒 加价模板 密价…

智慧园区能耗管控系统,3D可视化开发都需要哪些技术栈?

数据可视化&#xff1a; 数据可视化是将数据通过图表、图形、地图等可视化方式展示&#xff0c;使得数据更加直观、易于理解和分析。在智慧园区能耗管控系统中&#xff0c;可以使用各种图表库&#xff08;如Echarts、Highcharts&#xff09;和可视化工具&#xff08;如Tableau…

首个ICLR时间检验奖出炉,机器学习大牛Max Welling和OpenAI创始团队成员Diederik Kingma获奖

国际表征学习大会&#xff08;ICLR&#xff09;是机器学习领域的一个学术会议&#xff0c;每年一次&#xff0c;通常在每年四月底或五月初举行。会议包括特邀演讲以及经评审论文的口头和海报展示。 ICLR 由 Yann LeCun&#xff08;杨立昆&#xff09;和 Yoshua Bengio 两位图灵…

探索宇宙奥秘:太阳系运转的三维可视化之旅

在宇宙探索的伟大征途中&#xff0c;太阳系运转三维可视化技术为我们揭开了星辰大海的一角。通过图扑可视化技术&#xff0c;我们能够以前所未有的方式直观地体验和理解太阳及其周围行星的运动规律。这不仅是对于天文学家的一大帮助&#xff0c;也为广大天文爱好者和教育者提供…

AI换脸原理(2)——人脸检测参考文献S3FD:源码解析

1 介绍 S3FD是一个实时人脸检测器,这篇论文的主要思想是试图解决一个常见的问题,即基于anchor(锚点)的检测器随着人脸变小而急剧恶化。 基于锚点的目标检测方法是通过对一系列预设锚点进行分类和回归来检测目标的,这些锚点是通过在图像上有规律地平铺一组不同尺度和宽高比…

NGINX App Protect现已支持NGINX开源版 全方位加强现代应用安全防护

近日&#xff0c;F5 NGINX 发布全新升级的NGINX App Protect 5.0版本&#xff0c;将先前专属于NGINX 商业版本NGINX Plus 的现代应用安全能力拓展至NGINX开源版中&#xff0c;为增强现代应用和API安全防护提供全方位支持。此次升级后&#xff0c;适用于云端及本地部署的NGINX A…

ETCD 简介

ETCD 简介 1-etcd介绍 etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。具有以下特点&#xff1a; 简单&#xff1a;安装配置简单&#xff0c;而且提供了 HTTP API 进行交互&#xff0c;使用也很简单键…

Windows+Linux的虚拟串口工具

文章目录 1.Windows虚拟串口工具1.1 安装教程1.2 使用方法 2.Linux系统虚拟串口工具2.1 socat安装2.2 开启虚拟串口2.3 测试2.3.1 命令测试2.3.2 Cutecom工具测试 2.4 关闭虚拟串口 3.参考资料 1.Windows虚拟串口工具 下载地址&#xff1a;https://www.downxia.com/downinfo/4…

虚拟机镜像文件格式qcow2转zst

一、使用qcow2文件还原出pve虚拟机 1.1、在pve上创建一个空的新虚拟机 把虚拟机的网卡和磁盘删除 将外部磁盘镜像为vm中未使用的磁盘。这个镜像格式必须是qemu-img支持的镜像格式(qcow2/raw/vmdk) qm importdisk 101 bigdata-ubuntu-x86.qcow2 local-lvm此时查看pve上虚拟机…

Python | Leetcode Python题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:row,col len(matrix),len(matrix[0])row_l,row_r 0,row-1while row_l < row_r:m (row_lrow_r)//2if target < matrix[m][0]:row_r m-1…

[GESP样题 三级] 进制转换、春游、密码合规

B3849 [GESP样题 三级] 进制转换 题目 小美刚刚学习了十六进制&#xff0c;她觉得很有趣&#xff0c;想到是不是还有更大的进制呢&#xff1f;在十六进制中&#xff0c;用 A 表示 10、F 表示 15。如果扩展到用 Z 表示 35&#xff0c;岂不是可以表示 36进制数了嘛&#xff01;…

java spring 09 Bean的销毁过程 上 在docreatebean中登记要销毁的bean

1.Bean销毁是发送在Spring容器关闭过程中的 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);UserService userService (UserService) context.getBean("userService");userService.test();// 容器关闭cont…

2W 6KVDC 隔离双输出 DC/DC 电源模块——TPJ-2W 系列

TPJ-2W一款有超高隔离电压的电源模块&#xff0c;主要用于隔离度要求高的如医疗仪器和设备&#xff0c;特别在安全设备的应用中起着相当重要的作用&#xff0c;它的绝缘设计完全能满足对隔离电压要求超过6KVDC的应用&#xff0c;在额定负载2W的情况下&#xff0c;工作温度范围为…

基于springboot实现夕阳红公寓管理系统项目【项目源码+论文说明】

基于springboot实现夕阳红公寓管理系统演示 摘要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是…

ES6-自学01

调用方法读取文件&#xff1a;如果失败就throw抛出err,成功则抛出data 2.使用promise封装&#xff0c;如果失败就改变状态为 reject(err) 如果成功就 resolve(返回成功的值) &#xff0c;然后then,就可以获取返回的值&#xff0c;值toString&#xff08;&#xff09;方法来把…

ShowMeAI | 这是我们知道的,关于〖Suno 〗和〖AI音乐〗的一切

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; Suno 是一款AI音乐创作工具&#xff0c;可以通过提示词和设置生成一段音乐&#xff0c;而且可以包含歌词和人声 (这非常难得)。在经历了两年探索之后…