欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年12月20日 15:07:01   作者:L-H  
這篇文章主要為大家詳細介紹了java servlet手機app訪問接口(一),數(shù)據(jù)加密傳輸驗證,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

一、請求數(shù)據(jù)參數(shù)的加密與實現(xiàn)思路。

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

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

//下面這個方法三個參數(shù) 第一個是用戶token 第二個是加密所需要的參數(shù),等會我們通過用戶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, 查詢出來了,我們就需要拼接到,請求參數(shù)json后面,這樣servlet加密的字符串就與用戶加密的字符串一致了。下面就是查詢出加密token后拼接到請求參數(shù)后面的方法,
     */
    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上進行加密的方法調(diào)用,返回一個結果后,對比用戶傳遞的加密結果
   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調(diào)用的方法,下面是servlet頁調(diào)用的所有代碼

1、請求的URL

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

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

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

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

 //昨天在這里遇到個問題,就是當我請求參數(shù)中帶中文時,servlet獲取之后是亂碼的,之后用了下面這種方式好了.
   String requestJsonStr=new String(request.getParameter("parameter").getBytes("ISO8859-1"),"UTF-8");
   
   //提交參數(shù)
   JSONObject objectParameter=null;
  //idToken
   JSONObject requestParmeter=null;
  //idToken
   String idToken="";
  //客戶端加密字符串
   String md5Str="";
   try {
    //獲取總的JSON字符串,這里其實是我們從URL只傳遞的那個paramter一個參數(shù)
    objectParameter=new JSONObject(requestJsonStr);
    //提交參數(shù),json的一個key值,請求參數(shù)內(nèi)部的paramter,其實這個參數(shù)里面放的是業(yè)務中所需參數(shù),比如你登錄 帳號 密碼 這類型的
    requestParmeter=new JSONObject(objectParameter.getString("parameter"));
     //idToken 這個是用戶token,他就是用戶的唯一標識,我們是需要通過他來查詢數(shù)據(jù)庫中對應的 加密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;
       
     }

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Mybatis-plus 雙主鍵的實現(xiàn)示例

    Mybatis-plus 雙主鍵的實現(xiàn)示例

    本文主要介紹了Mybatis-plus 雙主鍵的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • JPA?CriteriaBuilder子查詢方式

    JPA?CriteriaBuilder子查詢方式

    這篇文章主要介紹了JPA?CriteriaBuilder子查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springcloud?如何解決微服務之間token傳遞問題

    springcloud?如何解決微服務之間token傳遞問題

    這篇文章主要介紹了springcloud?如何解決微服務之間token傳遞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Mybatis-Plus實現(xiàn)自定義SQL具體方法

    Mybatis-Plus實現(xiàn)自定義SQL具體方法

    Mybatis-Plus是Mybatis的一個增強工具,它可以優(yōu)化我們的開發(fā)效率,這篇文章主要介紹了Mybatis-Plus實現(xiàn)自定義SQL,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Java基礎之包裝類

    Java基礎之包裝類

    這篇文章主要介紹了Java基礎之包裝類,文中有非常詳細的代碼示例及基礎知識詳解,對正在學習java基礎的小伙伴們有很大的幫助喲,需要的朋友可以參考下
    2021-05-05
  • WebSocket實現(xiàn)系統(tǒng)后臺消息實時通知功能

    WebSocket實現(xiàn)系統(tǒng)后臺消息實時通知功能

    在現(xiàn)代Web應用中,提供實時通知對于改善用戶體驗至關重要,WebSocket技術允許建立雙向通信通道,從系統(tǒng)后臺將消息實時傳送給系統(tǒng)用戶,下面我們就來深入探討一下如何使用WebSocket來實現(xiàn)這一功能吧
    2023-10-10
  • Java多線程并發(fā)的指令重排序問題及volatile寫屏障原理詳解

    Java多線程并發(fā)的指令重排序問題及volatile寫屏障原理詳解

    這篇文章主要介紹了Java多線程并發(fā)的指令重排序問題及volatile寫屏障原理詳解,指令重排序是編譯器或處理器為了提高性能而對指令執(zhí)行順序進行重新排列的優(yōu)化技術,需要的朋友可以參考下
    2024-01-01
  • Java創(chuàng)建線程的方式解析

    Java創(chuàng)建線程的方式解析

    這篇文章主要介紹了Java創(chuàng)建線程的方式解析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-07-07
  • Java編程代碼性能優(yōu)化

    Java編程代碼性能優(yōu)化

    本文介紹了 Java 代碼優(yōu)化的過程,總結了優(yōu)化 Java 程序的一些最佳實踐,分析了進行優(yōu)化的方法,并解釋了性能提升的原因,需要的朋友可以參考下
    2015-11-11
  • 查看import的類是出自哪個jar包的方法

    查看import的類是出自哪個jar包的方法

    下面小編就為大家?guī)硪黄榭磇mport的類是出自哪個jar包的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論