程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java servlet手機app訪問接口(一)數據加密傳輸驗證

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

編輯:關於JAVA

java servlet手機app訪問接口(一)數據加密傳輸驗證。本站提示廣大學習愛好者:(java servlet手機app訪問接口(一)數據加密傳輸驗證)文章只能為提供參考,不一定能成為您想要的結果。以下是java servlet手機app訪問接口(一)數據加密傳輸驗證正文


後面幾篇關於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;
       
     }

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved