1.开发测试环境搭建(审计环境)1.1.开发环境
RuiYi历史版本下载地址
安装IDEA
配置Maven
安装Mysql
创建数据库ry
运行下载源码中的sql
获得如下表
修改连接数据库的用户名密码、路径
启动redis
运行环境
1.2.linux生产环境
文件路径更改为linux的文件上传路径(任意)
使用Maven插件打包为jar
ruoyi-admin.jar移至linux环境
使用命令java -jar ruoyi-admin.jar前台运行程序,或者使用命令 nohup java -jar ruoyi-admin.jar >log.txt 2>&1 & 后台运行
访问地址:80端口即可。
2.历史漏洞2.1. Shiro反序列化(RuoYi<V-4.6.2)
该漏洞原理简单来说就是Shiro将用户认证信息存储到remeberme字段中,后端读取该字段是将该字段在服务器反序列化并通过可利用的gadget实现RCE漏洞。虽然shiro使用了AES加密remeberme字段信息,但是由于sh ...
1.修改注册表
快捷键◀Win+R打开运行命令窗口
输入regedit打开注册表
依次找到如下键值路径
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings
找到FlightSettingsMaxPauseDays键值双击打开
如果是新版本的Win10删除了该FlightSettingsMaxPauseDays键,那就新建一个就OK
新建一个DWORD32位值,然后改名为FlightSettingsMaxPauseDays即可。
修改基数十进制计数,输入3650(表示最大暂停天数,也可以输入其他的值)
到这一步我们只是修改了最大暂停天数,这个时候我们需要设置实际的暂停天数
2.修改暂停天数
打开windows设置,选择更新和安全
点击高级选项
在这就可以选择实际暂停的天数了
1.守护进程1234root@user-ubantu:~# ps -ef | grep nginxroot 6905 1 0 10:36 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;www-data 6907 6905 0 10:36 ? 00:00:00 nginx: worker processwww-data 6908 6905 0 10:36 ? 00:00:00 nginx: worker process
master主进程
worker子进程
2.查看端口占用情况12345678root@user-ubantu:~# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnginx 6905 root 6u IPv4 51224 0t0 T ...
1.axios请求拦截器判断请求类型
当请求为get请求时拼接请求参数
src\utils\request.js
12345678910//初始化data,data为需要进行签名的字符串let data = config.urlif (config.method === 'get' && config.params) { data += '?' for (let key in config.params) { data += (key + "=" + config.params[key]+ "&") } //删除多余的& data = data.slice(0, -1);}
当请求为post时拼接请求参数
src\utils\request.js
12345if (config.method === 'post' && (typeof con ...
具体实现细节链接地址:
项目简介
密钥交换和用户认证
敏感数据加密传输
传输签名校验
数据库用户密码加密
配置文件加密
项目仓库链接地址
前端VUE
后端SpringBoot
项目演示链接地址
LOGIN-DEMO
默认用户名密码:admin,admin123
1.项目简介1.1.密钥交换和用户认证
前端请求后端获取SM2公钥
前端随机生成SM4密钥(key+iv)
用户认证(用户输入用户名和密码)
前端分别使用SM2公钥加密(用户密码、key、iv)
后端使用SM2私钥解密获得(用户密码、key、iv)
用户认证成功将key、iv存入loginUser然后存入redis
生成JWT,请勿将key、iv存入JWT (JWT只能保证数据完整性)
返回前端存入sessionStorage (完成用户认证和密钥交互)
使用sm4密钥加密业务数据进行传输
1.2.敏感数据加密传输
前端从sessionStorage中获取sm4密钥和iv
加密敏感数据发送至后端
后端使用从JWT中获取到redisKey获取该登陆会话的loginUser,并从loginUser中获取到 ...
1.前端获取SM2公钥
通过钩子函数当用户访问登陆页面时请求获取公钥,并存入sessionStorage
前端axios请求
src\views\Login.vue
123456789101112131415mounted() { this.axios.get('/getPublicKey').then((resp) =>{ let data = resp.data; if(data.code==200){ sessionStorage.setItem('publicKey', data.data.publicKey); } else{ this.$message({ message: "获取公钥失败", type:'error' }); } & ...
1.前端SM4加密
从sessionStorage中获取key和iv加密手机号
src\views\Home.vue
123456this.homeForm.phoneNumber = this.tempPhomeNumberSM4Data.key = sessionStorage.getItem("secretKey")SM4Data.iv = sessionStorage.getItem("iv")SM4Data.originalData = this.homeForm.phoneNumberencryptSM4(SM4Data)this.homeForm.phoneNumber = SM4Data.encryptedData
发送给密文到后端
src\views\Home.vue
1this.axios.get('/getApiTest', { params: this.homeForm })
2.后端读取SM4密钥
后端j接口处获取到加密后的请求数据
com/gaomu/co ...
1.实现PasswordEncoder接口
通过实现PasswordEncoder接口设置自定义的密码加密规则和匹配规则
实现三次带盐的SM3加密
实现逻辑为SM3(SALT+SM3(SALT+SM3(SALT+PASSWORD)))
com/gaomu/utils/crypto/SM3PasswordEncoder.java
123456789101112131415161718192021public class SM3PasswordEncoder implements PasswordEncoder {//密码加密规则 @Override public String encode(CharSequence rawPassword) { String pwdDigest = rawPassword.toString(); for (int i = 0; i < 3; i++){ pwdDigest = SM3Util.passwordDigest(pwdDigest); ...
1.导入jasypt坐标
添加jasypt依赖坐标
pom.xml
12345<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version></dependency>
2.实现自定义配置文件加密算法
实现接口PBEStringEncryptor
com/gaomu/utils/crypto/SM4YmlEncryptor.java
1234567891011121314151617181920212223242526272829303132333435public class SM4YmlEncryptor implements PBEStringEncryptor { private String password; //密钥key不可硬编 ...
1.SM2
SM2是一种基于椭圆曲线密码算法,主要包括公钥加密和数字签名两部分。SM2的安全性基于椭圆曲线离散对数难题,对于给定的椭圆曲线,其离散对数问题的难度远超过同等长度的RSA。因此,SM2相比RSA,可以在提供相同安全级别的情况下,使用更短的密钥长度,从而节省存储和计算资源。
在SM2中,公钥和私钥的长度通常都是256位。具体来说:
私钥:私钥是一个256位的随机数,也就是32字节。这个随机数是在椭圆曲线的阶数范围内随机选择的。
公钥:公钥是由私钥生成的,它是椭圆曲线上的一个点,包括x和y两个坐标,每个坐标都是256位,也就是32字节。所以,公钥的总长度是512位,也就是64字节。
需要注意的是,虽然私钥只有256位,但由于椭圆曲线离散对数问题的复杂性,破解SM2的私钥需要的计算量与破解相同长度的RSA私钥所需的计算量相比,要大得多。因此,SM2可以提供相当高的安全性。
SM2为非对称加密算法(加解密密钥不一致),即公钥加密私钥解密,公钥可公开,私钥不可公开。SM2不仅可以用来加密数据,SM2还可以用来数字签名,使用私钥对数据进行签名,公钥验证签名。
SM2为 ...