java servlet手機app提供者(一)資料加密傳輸驗證_java

來源:互聯網
上載者:User

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.