小小加密应用

        日前,大家在公司讨论一个很激烈的问题,原来有个小黑客在网上通过模拟ip和post请求,不断访问发送短信的接口,要知道,发送短信这个功能是接入第三方平台来完成的!每一条短信的发送就代表着流量和短信条数的流失,造成金钱的浪费。经过两天的试验,大神简单设计了一个算法,暂时解决了该问题,也跟大神学习一下:


       首先发送短信的功能是用阿里云的服务实现的,它首先提供了一个风险拦截系统!也做出了基本限制,比如,每个ip每个电话号码每天可以发送10条等。实现方式:


      1. 在html页面添加风控控件和加密隐藏字符串:

<input id="encodeString" value="${encodeString}" hidden/>
<!-- 此段必须要引入 -->
<div id="_umfp" style="display:none;width:1px;height:1px;overflow:hidden"></div>
<!-- 引入结束 -->
<div class="form-group" style="display:none;" id="afsCheck">
	<div id="dom_id"></div>
	<!-- 风险拦截参数 -->
	<input type='hidden' id='csessionid' name='session'/>
	<input type='hidden' id='sig' name='sig'/>
	<input type='hidden' id='token' name='token'/>
	<input type='hidden' id='scene' name='scene'/>
</div>

       2.js代码

//反欺诈初始化
	var nc = new noCaptcha();
	var nc_appkey = 'xxx';  // 应用标识,不可更改
         var nc_scene = 'register';  //场景,不可更改
	var nc_token = [nc_appkey, (new Date()).getTime(), Math.random()].join(':');
	var nc_option = {
		renderTo: '#dom_id',//渲染到该DOM ID指定的Div位置
		appkey: nc_appkey,
                    scene: nc_scene,
		token: nc_token,
        //trans: '{"name1":"code100"}',//测试用,特殊nc_appkey时才生效,正式上线时请务必要删除;code0:通过;code100:点击验证码;code200:图形验证码;code300:恶意请求拦截处理
		callback: function (data) {// 校验成功回调
			document.getElementById('csessionid').value = data.csessionid;
			document.getElementById('sig').value = data.sig;
			document.getElementById('token').value = nc_token;
            document.getElementById('scene').value = nc_scene;
            
            var afsToken=$("#encodeString").val();
            /*reloadAbleJSFn("afs","//g.alicdn.com/sd/pointman/js/pt.js");*/
            $("#basic-addon2").unbind();
            $("#basic-addon2").click(function(){
            	 //风险识别
				/*pointman.use('do', function () {
					var afs = pointman.getConfig();
					afsToken = afs.token;
				});*/
				
        		var mobile = $("#phoneRegister").val();
        		if(checkWeixinMobile("#phoneRegister",mobile)&&checkUserIsJoin("#phoneRegister",mobile)){
        			//发送验证码并且成功
        			if(saveAfsData(mobile,afsToken,'000001')==1&&sendValidateCode(mobile,'000001')==0){
        				countDown("basic-addon2",59,mobile,'000001')
        			}
        		}
        	});
		}
	};
	nc.init(nc_option);


        3. 如上js代码中封装完成风控控件后,通过验证前面页面保存到页面的加密字符串与第二次访问进行对比,相同则验证通过,不同则验证不通过。java加密实现方式有很多种,下面采用MessageDigest和BASE64Encoder联合加密的方式举例:

public static String encryption(HttpServletRequest request){
		String sysRandomNum=new StringBuilder("要加密的字符串").toString(); 
		MessageDigest md5;
		try {
			md5=MessageDigest.getInstance("MD5");
			BASE64Encoder base64en=new BASE64Encoder();
			sysRandomNum=base64en.encode(md5.digest(sysRandomNum.getBytes("utf-8")));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sysRandomNum;
	}


        加密的本质就是通过一定的算法对字符重新编码,我们可以利用现有的字符串处理函数对字符进行简单处理,比如,反向,移位等,然后通过编码函数进行编码,增加破解复杂度。


参考资料:

       http://download.csdn.net/detail/chuanyu/8819109#comment

       http://blog.csdn.net/hudashi/article/details/8394158

       http://blog.csdn.net/anhuixiaozi/article/details/6219337


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值