java servlet手機app訪問接口(一)數據加密傳輸驗證


 

本人開發的開發者技術變現資源聚集地,大家支持下,下面是網址

https://www.baiydu.com

 

前面幾篇關於servlet的隨筆,算是拉通了 servlet的簡單使用流程,接下去的文章將主要圍繞手機APP訪問接口這塊出發續寫,md5加密傳輸--->短信驗證--->手機推送--->分享--->百度雲圖---->支付....第三方的業務 ...由於我是新手我也是一邊學一邊寫,不足地方希望諒解。

     今天這篇文章主要涉及到 javaservlet傳輸數據的加密,客戶端請求參數的組合,並且會附帶上我中途遇到的所有問題以及解決方法。

  

由於手機訪問接口是公布出來的,所以不管用什么語言編寫接口,我們就應該做相應的安全措施,否則人家知道你的URL之后,截獲客戶端的請求,然后修改提交參數,這樣損失就大了。用servlet寫接口用得最多的也應該是對傳輸數據進行一個加密,如果是webservice .net的wcf這些這樣的技術來編寫,還會涉及到證書的匹配....

 

一、請求數據參數的加密與實現思路。

     加密這里我使用的md5 32位的加密,32位是一個不可逆的加密,這樣即使被黑客截獲了,也是沒辦法將我們加密后的MD5值,解密成我們加密時組合的字符串的。  當然這個不是絕對的,好像前幾年已經有計算機方面的專家破譯了MD5的加密方式,但我覺得那技術首先可能不會隨意公布出來,然后即使公布了也不是一般人能明白的,否則      你隨便問一個程序員 MD5加密你還在用嗎,那肯定回答是 沒有了。

      

     1、首先我說下我請求參數的組合思路,因為這里涉及到了MD5加密,所以我們必須在用戶使用APP登錄帳號之后,反饋給用戶兩個token,第一個token是表示用戶身份的唯一值,這個token是需要增加到請求接口參數中的(這個參數是否參與加密,是你自己定不影響,我這里是參與了的),因為servlet需要通過它來查詢用戶的加密所需token, 第二個token是用來加密md5的值,這個token是不能增加到請求接口參數中去的,而且這兩個token我們都必須保存到數據庫中,因為用戶請求接口之后,serlvet需要獲取參數中的用戶token然后去數據庫中查詢 md5加密所需token,然后servlet再將查詢來的加密token增加到用戶傳遞來的字符串中去,再次進行一個md5加密,加密后對比用戶傳遞的md5加密后的值,是否與servlet加密后的值一樣,如果不一樣,那么原因就可能有兩個,servlet這邊加密字符串組合錯誤,用戶傳輸數據中途被截修改過。這兩個token我都是使用的java uuid生成的,應為uuid生成的是一個唯一值。生成方式很簡單。下面是代碼

    public static String getUUID()    
    {    
    return UUID.randomUUID().toString(); 
     
    }   
    

 

   下面是java md5 32位加密方法

    public static String md5Encrypt(String groupParamertStr) throws UnsupportedEncodingException {
         
         MessageDigest messageDigest = null;  
            try {  
                messageDigest = MessageDigest.getInstance("MD5");  
                messageDigest.reset();  
                messageDigest.update(groupParamertStr.getBytes("UTF-8"));  
            } catch (NoSuchAlgorithmException e) {  
                System.out.println("NoSuchAlgorithmException caught!");  
                System.exit(-1);  
            } catch (UnsupportedEncodingException e) {  
                e.printStackTrace();  
            }  
            byte[] byteArray = messageDigest.digest();  
            StringBuffer md5StrBuff = new StringBuffer();  
            for (int i = 0; i < byteArray.length; i++) {  
                if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)  
                    md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));  
                else  
                    md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));  
            }  
            return md5StrBuff.toString();  
        
        
    }

 

下面是servlet這邊獲取參數進行加密后,使用加密結果與用戶請求傳遞的加密結果進行一個對比。如果一樣說明請求沒問題,否則請求參數值有可能被修改過

//下面這個方法三個參數  第一個是用戶token  第二個是加密所需要的參數,等會我們通過用戶token查詢出 加密token之后,我們需要將它拼接到servlet加密所需json字符串中去,第三個就是從客戶端傳來的 加密結果字符串  這里方法返回0表示 用戶加密后的結果沒有問題,否則就有錯
    public static int postTokenVerify(String token, JSONObject requestJsonObject,
            String encryptStrValue) {
        int   returnValue=0;
        String[]   mysqlParameter=new String[]{token};
        //下面就是通過用戶token查詢 用戶的加密token 
        ResultSet  returnData=MySqlHepler.executeQuery("select * from infosheet where idToken=?", mysqlParameter);
        JSONObject returnObject=null;
        try {
            returnObject = ResultToJsonTool.resultSetToJsonObject(returnData);
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        
     
        
         String  byEncryptStrValue="";
         try {
            if (returnObject.getString("encryptToken").length()>2) {//說明用戶的idToken存在,
                    // return returnValueString;
                
                //{"idToken":"123456","id":"34","pwd":"23","encryptToken":"2345678","account":"hang"}
                /*下面的代碼是在匹配JAVAMD5加密字符串, 
因為用戶加密時,增加了加密token到加密字符串中去,但是請求時又不能傳遞這個加密token,所以我們servlet加密時需要通過用戶token去查詢用戶的加密toke, 查詢出來了,我們就需要拼接到,請求參數json后面,這樣servlet加密的字符串就與用戶加密的字符串一致了。下面就是查詢出加密token后拼接到請求參數后面的方法,
*/ byEncryptStrValue=requestJsonObject.toString().substring(0, requestJsonObject.toString().length()-1); JSONObject encryptTokenJsonObject=new JSONObject(); encryptTokenJsonObject.put("encryptToken",returnObject.getString("encryptToken")); String value1=encryptTokenJsonObject.toString().substring(1, encryptTokenJsonObject.toString().length()); byEncryptStrValue=byEncryptStrValue+","+value1; // } else { returnValue=1;//idtoken錯 誤 } } catch (JSONException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { //下面方法就是使用拼接正確的字符串 在servlet上進行加密的方法調用,返回一個結果后,對比用戶傳遞的加密結果 String javaMd5Result=EncryptSafa.md5Encrypt(byEncryptStrValue); if (javaMd5Result.equals(encryptStrValue)) {//加密串是正確的 } else { returnValue= 2;//加密結果有錯 } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return returnValue; }

 

 

 

前面都是封裝好的被servlet調用的方法,下面是servlet頁調用的所有代碼

1、請求的URL

這里我是傳遞的是一個字典轉換json格式的參數,是一個鍵值對形式,請求參數只用了一個。 參數中的idToken就是用戶token,值我是在數據庫中隨便增加的一個123456

沒使用uuid,當然正式做肯定不會這樣。

http://localhost:8080/JAVAServletTest/2.jsp?parameter={"parameter":"{\"idToken\":\"123456\",\"pwd\":\"漢字\",\"account\":\"hang\"}","md5Str":"672f4a8c6fb92103c01d4275e46df790"} 

 

下面是servlet頁面處理的代碼,整個流程就是為了驗證用戶請求在傳遞的途中是否被修改過。

   //昨天在這里遇到個問題,就是當我請求參數中帶中文時,servlet獲取之后是亂碼的,之后用了下面這種方式好了.
          String  requestJsonStr=new String(request.getParameter("parameter").getBytes("ISO8859-1"),"UTF-8");
          
          //提交參數
          JSONObject objectParameter=null;
        //idToken
          JSONObject requestParmeter=null;
        //idToken
          String idToken="";
        //客戶端加密字符串
          String md5Str="";
          try {
              //獲取總的JSON字符串,這里其實是我們從URL只傳遞的那個paramter一個參數
              objectParameter=new JSONObject(requestJsonStr);
              //提交參數,json的一個key值,請求參數內部的paramter,其實這個參數里面放的是業務中所需參數,比如你登錄 帳號 密碼 這類型的
               requestParmeter=new JSONObject(objectParameter.getString("parameter"));
                  //idToken 這個是用戶token,他就是用戶的唯一標識,我們是需要通過他來查詢數據庫中對應的 加密token的
                 idToken=requestParmeter.getString("idToken");    
                 //客戶端加密字符串  
                 md5Str=objectParameter.getString("md5Str");
        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
          
          
          
             //MD5加密后生成的字符串
          
             //下一步是驗證token是否正確
          int tokenVerifyResult=EncryptSafa.postTokenVerify(idToken, requestParmeter, md5Str);
              if (tokenVerifyResult==0) {
                  
                  out.println("token加密方式正確");
                 
                     }
                       
                else {
                          out.println("加密token或加密方式錯誤");
                          return;
                         
                    }
             

 

 

 本人創業做的一款androidApp, 下載量已經有2000多萬,各種當前熱門的網絡手機獎勵紅包全部集成,另外還有熱門電影和淘寶高額優惠券!很適合各類型的用戶。

 

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM