若依框架SpringBoot使用AES对登录进行加密(不分离版)
文章目录若依框架登录功能进行AES加密1. 引入crypto-js2. 项目引入JS前端加密若依框架登录功能进行AES加密前言: 项目在渗透测试时发现若依平台登录接口未加密,所以需要对登录信息进行加密处理下面就直接开始1. 引入crypto-js百度网盘链接:https://pan.baidu.com/s/1omNoh4GbuyDp3JG3wXQ5sw提取码:3udt2. 项目引入JS前端加密将下
·
若依框架登录功能进行AES加密
前言: 项目在渗透测试时发现若依平台登录接口未加密,所以需要对登录信息进行加密处理下面就直接开始
补充: 最开始尝试了几种方法都不成功,最终这种方法是成功的,缺点还是前端知识不足导致的。
##前端处理
1. 引入crypto-js
- 百度网盘链接:https://pan.baidu.com/s/1omNoh4GbuyDp3JG3wXQ5sw
- 提取码:3udt
2. 项目引入JS前端加密
- 将下载的JS放入项目中(此处我方在resource–>rouyi)下的
调整前端登录请求加密用户名密码
- 一、在login.js中导入如下js-作用(主要是在JS中导入外部Js文件并在内部使用)
function addScript(url) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', url);
document.getElementsByTagName('head')[0].appendChild(script);
}
- 二、在login中添加前端加密方法
function encrypt(data) {
// 定义前端Key秘钥-需要注意 跟后端解密秘钥保持一直
let key = 'uUXsN6okXYqsh0BB';
key = CryptoJS.enc.Utf8.parse(key);
let encrypted = CryptoJS.AES.encrypt(data, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encrypted.ciphertext.toString()));
}
- 二、在登录JS中加载刚刚导入的crypto-js文件
- 对username、password进行加密处理
- 代码如下
addScript('./crypto-js.min')
$.modal.loading($("#btnSubmit").data("loading"));
var username = $.common.trim($("input[name='username']").val());
var password = $.common.trim($("input[name='password']").val());
var validateCode = $("input[name='validateCode']").val();
var rememberMe = $("input[name='rememberme']").is(':checked');
var username1 = encrypt(username);
var password1 = encrypt(password);
$.ajax({
type: "post",
url: ctx + "login",
data: {
"username": username1,
"password": password1,
"validateCode": validateCode,
"rememberMe": rememberMe
},
success: function (r) {
if (r.code == 0) {
location.href = ctx + 'index';
} else {
$.modal.closeLoading();
$('.imgcode').click();
$(".code").val("");
$.modal.msg(r.msg);
}
}
});
后端代码
先导入AESutils工具类
- 工具类代码如下
package com.unicom.tsm.common.utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
public class AESUtils {
private final static String sKey="uUXsN6okXYqsh0BB";
public static String encrypt(String sSrc, String sKey) {
if (sKey == null) {
throw new IllegalArgumentException("sSrc不能为空");
}
// 判断Key是否为16位
if (sKey.length() != 16) {
throw new IllegalArgumentException("sKey长度需要为16位");
}
try {
byte[] raw = sKey.getBytes(StandardCharsets.UTF_8);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
//"算法/模式/补码方式"
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes(StandardCharsets.UTF_8));
//此处使用BASE64做转码功能,同时能起到2次加密的作用。
return new Base64().encodeToString(encrypted);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String decrypt(String sSrc) {
try {
byte[] raw = sKey.getBytes(StandardCharsets.UTF_8);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//先用base64解密
byte[] encrypted1 = new Base64().decode(sSrc);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, StandardCharsets.UTF_8);
return originalString;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
找到登录接口进行解密
- login接口添加如下代码
username = AESUtils.decrypt(username);
password = AESUtils.decrypt(password);
到了完成了这一步之后访问试试,username 跟 password已经加密成功。
更多推荐
所有评论(0)