小小加密應用

        日前,大家在公司討論一個很激烈的問題,原來有個小黑客在網上通過模擬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


發佈了175 篇原創文章 · 獲贊 121 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章