参数前后台加密校验

参数前后台加密校验


方案原因:防止fiddler抓包时修改参数,在ajax发送前统一拦截ajax,获取参数,加密之后放到header中,后台编写一个过滤器filter,所有请求都经过过滤器,取出参数,拼接加密,取出header,比对成功就说明没有被修改,不一样则表示被修改了

ajax发送前拦截

/**
 * 在ajax发送之前添加加密参数
 */
$(document).ajaxSend(function(event,xhr,options){
    //判断是否有MD5加密的js文件,没有则添加上
    if($("script[src='/js/jQuery.md5.js']").length <= 0){
        $("head").append('<script src="/js/jQuery.md5.js"></script>');
    }
    var url=options.url;
    var data=options["data"];
    //获取url?之后拼接的参数
    var allArray=[];
    var urlArray=[];
    var dataArray=[]
    if(url.indexOf("?")>-1){
        var urlDataStr=url.slice(url.lastIndexOf("?")+1,url.length);
        urlArray=urlDataStr.split("&");
    }
    //获取data参数
    if(data){
        dataArray=data.split("&");
    }
    //将拼接的参数和data参数拼接起来
    allArray=urlArray.concat(dataArray);
    //记录key和对应的位置
    var keyJson={};
    //如果有相同key的时候,在数组中移除
    for (var i = 0; i < allArray.length; i++) {
        var key=allArray[i].split("=")[0];
        var value=allArray[i].split("=")[1];
        //如果数组中key有相同的时候,删除这个数组 且value不为空
        if (!keyJson.hasOwnProperty(key) && value!=null && ""!=value+""){
            keyJson[key]="";
        }else{
            allArray.splice(i,1);
            i--;
        }
    }
    //将数组按首字母排序
    allArray.sort();
    //遍历数组
    var dataMap={};
    var comparison="";
    //拼接value
    for (var i = 0; i < allArray.length; i++) {
        var dataSplit=allArray[i].split("=");
        var value=dataSplit[1];
        comparison+=value;
    }
    //中文转译解码 及空格加号编码和解码的问题
    comparison=decodeURIComponent(comparison.replace(/\+/g, '%20'));
    xhr.setRequestHeader("comparison",$.md5(comparison));
});

filter方法

	// 获取请求头comparison
	String comparison = request.getHeader("comparison");
	// 将key取出来放到list集合中
	List<String> paramKeyList = new ArrayList();
	//paramMap是获取的request的参数
	Iterator iterator = paramMap.keySet().iterator();
	// 将key按首字母排序
	while (iterator.hasNext()) {
		paramKeyList.add((String) iterator.next());
	}
	Collections.sort(paramKeyList);
	StringBuffer paramValueStr = new StringBuffer();
	// 取出value进行拼接 如果value不为空的情况下
	for (String key : paramKeyList) {
		String[] value = (String[]) paramMap.get(key);
		if (value[0] != null && !"".equals(value[0])) {
			paramValueStr.append(value[0]);
		}
	}
	// md5加密(这是自己封装的MD5加密方法)
	String encryptString = EncryptTool.EncryptString(paramValueStr.toString().trim());
	// 获取
	// 比对,如果和前台不一样,直接返回
	if (!comparison.equals(encryptString)) {
		return;
	}

注意事项

decodeURIComponent(comparison.replace(/\+/g, '%20'));

1.方法拦截前已经对参数编码了,所以调用decodeURIComponent对方法解码
2.由于两种协议不同的原因,replace(/+/g, ‘%20’),把所有加号换成’%20’,具体请见:URL中关于空格的编码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AES即高级加密标准(Advanced Encryption Standard),是一种对称加密算法,适用于加密和解密数据。 在AES加密解密中,加密和解密操作均在应用程序的台进行。具体过程如下: 1. 加密过程:首先,应用程序将待加密的明文通过AES算法进行加密处理。加密过程中需要指定密钥,密钥可以是128位、192位或256位的长度。应用程序利用密钥和AES算法将明文转化为密文。 2. 解密过程:当需要解密密文时,应用程序将密文通过相同的AES算法和密钥进行解密处理。解密过程会还原出原始的明文。 在AES后台加密解密中,加密和解密操作由后台系统完成。具体过程如下: 1. 加密过程:后台系统接收到待加密的明文,在不暴露密钥的情况下,使用AES算法和事先设定好的密钥进行加密处理。加密后的密文可以被传输到台应用程序进行存储或传输。 2. 解密过程:当需要解密密文时,应用程序将密文传递给后台系统。后台系统利用之设定好的密钥和AES算法对密文进行解密处理,还原出原始的明文。解密后的明文可以再次传输给台应用程序进行处理或显示。 无论是加密解密还是后台加密解密,使用AES算法可以提供高强度的数据保护,保证数据在传输和存储过程中的机密性和完整性。同时,密钥的安全性也是保障AES加密解密过程中重要的一环,应该采用安全可靠的方式管理和存储密钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值