栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

若依框架SpringBoot使用AES对登录进行加密(不分离版)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

若依框架SpringBoot使用AES对登录进行加密(不分离版)

文章目录
  • 若依框架登录功能进行AES加密
      • 1. 引入crypto-js
      • 2. 项目引入JS前端加密
      • 调整前端登录请求加密用户名密码
    • 后端代码
      • 先导入AESutils工具类
      • 找到登录接口进行解密

若依框架登录功能进行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已经加密成功。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678427.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号