AES 前端加密 JAVA后端解密 Pkcs7

1 篇文章 0 订阅

 前端加解密帮助类

/*
 * 前端加解密帮助类
 */
const AesHelper = function (param) {
    let config = {
      key:'4c04ad9c8723bf00',
      iv:'5d2a817a522099fa'
    };
    config = {...config,...param};

    AesHelper.prototype.encrypt = (text) => {
        return CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(config.key), {
            iv: CryptoJS.enc.Utf8.parse(config.iv),
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }).toString();
    };

    AesHelper.prototype.decrypt = (text) => {
        return CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(config.key), {
            iv: CryptoJS.enc.Utf8.parse(config.iv),
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }).toString(CryptoJS.enc.Utf8);
    }
};

 前端ajax设置参数加密

/*
*前端ajax设置参数加密
*/
$.ajaxSetup({
            beforeSend: function() {
                let requestType = arguments[1].type.toLocaleLowerCase();
                if(requestType === "get"){
                    var url = arguments[1].url;
                    if(url.indexOf("?") && url.split("?").length !== 0){
                        let split = url.split("?");
                        let requestParams = decodeURIComponent(split[1]);
                        let encrypt = new AesHelper().encrypt(requestParams);
                        encrypt = encodeURIComponent(encrypt);
                        arguments[1].url = `${split[0]}?content=${encrypt}`;
                    }
                }else if(requestType === "post"){
                    if(! (arguments[1].data instanceof FormData)){
                        let requestParams = decodeURIComponent(arguments[1].data);
                        let encrypt = new AesHelper().encrypt(requestParams);
                        encrypt = encodeURIComponent(encrypt);
                        arguments[1].data = `content=${encrypt}`;
                    }
                }
            }
        });

JAVA后台解密

@WebFilter(urlPatterns = {"/*"})
public class DecodeFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
        Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
        if(parameterMap.containsKey("content")){
            String[] strings = parameterMap.get("content");
            String encryptedData = strings[0];
            //解密
            String decrypt = AesUtil.decrypt(encryptedData);
            //拆分
            if(!StringUtil.isBlank(decrypt)){
                Map<String, Object> map = MapUtil.formSerializeToMap(decrypt);
                parameterMap.clear();
                for(String keys:map.keySet()){
                    String[] values = new String[]{map.get(keys)+""};
                    parameterMap.put(keys,values);
                }
            }

            changeRequestWrapper.setParameterMap(parameterMap);
            //使用复写后的wrapper
            filterChain.doFilter(changeRequestWrapper, servletResponse);
        }else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

 JAVA后台解密帮助类

public class AesUtil {
    private static final String KEY = "key";
    private static final String IV = "iv";

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public static String encrypt(String data){
        try {
            return encrypt(data,KEY,IV);
        } catch (Exception e) {
            return "";
        }
    }

    public static String decrypt(String encryptedData){
        try {
            return decrypt(encryptedData,KEY,IV);
        } catch (Exception e) {
            return "";
        }
    }

    public static String encrypt(String data,String sessionKey,String iv) throws Exception {
        Base64.Encoder encoder = Base64.getEncoder();
        String baseData = encoder.encodeToString(data.getBytes());
        String baseSessionKey = encoder.encodeToString(sessionKey.getBytes());
        String baseIv = encoder.encodeToString(iv.getBytes());
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] dataByte = decoder.decode(baseData);
        byte[] keyByte = decoder.decode(baseSessionKey);
        byte[] ivByte = decoder.decode(baseIv);
        String encryptedData = null;
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
        Key sKeySpec = new SecretKeySpec(keyByte, "AES");
        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
        params.init(new IvParameterSpec(ivByte));
        cipher.init(Cipher.ENCRYPT_MODE, sKeySpec, params);
        byte[] result = cipher.doFinal(dataByte);
        encryptedData = encoder.encodeToString(result);
        return encryptedData;
    }

    public static String decrypt(String encryptedData,String sessionKey,String iv) throws Exception {
        Base64.Encoder encoder = Base64.getEncoder();
        String baseSessionKey = encoder.encodeToString(sessionKey.getBytes());
        String baseIv = encoder.encodeToString(iv.getBytes());
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] dataByte = decoder.decode(encryptedData);
        byte[] keyByte = decoder.decode(baseSessionKey);
        byte[] ivByte = decoder.decode(baseIv);
        String data = null;
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
        Key sKeySpec = new SecretKeySpec(keyByte, "AES");
        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
        params.init(new IvParameterSpec(ivByte));
        cipher.init(Cipher.DECRYPT_MODE, sKeySpec, params);
        byte[] result = cipher.doFinal(dataByte);
        data = new String(result);

        return data;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值