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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐