久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

微信開發(fā)(五)微信消息加解密 (EncodingAESKey)

 關(guān)平藏書 2018-02-07




消息體加密

隨著微信服務開發(fā)在越來越多的領(lǐng)域應用,,應用的安全性逐漸被重視起來,。本文主要闡述如何為微信的消息加密的原理與Java版本的實現(xiàn),。

原理

做過微信開發(fā)的朋友們都知道,微信使用xml格式的消息結(jié)構(gòu),。這里著重說一下最核心的收發(fā)消息,。

在明文模式中,,POST請求有signature, timestamp, nonce三個參數(shù),。它的Body為一個XML:

  1. <xml>  
  2.     <ToUserName><![CDATA[toUser]]></ToUserName>  
  3.     <FromUserName><![CDATA[fromUser]]></FromUserName>   
  4.     <CreateTime>1348831860</CreateTime>  
  5.     <MsgType><![CDATA[text]]></MsgType>  
  6.     <Content><![CDATA[this is a test]]></Content>  
  7.     <MsgId>1234567890123456</MsgId>  
  8. </xml>  

而在加密模式中,,增加了兩個參數(shù):encrypt_typemsg_signature 。它的Body 也變更為:

  1. <xml>  
  2.     <ToUserName><![CDATA[toUser]]></ToUserName>  
  3.     <Encrypt><![CDATA[encryptData]]></Encrypt>  
  4. </xml>  

其中encryptData是加密后的信息,,通過我們在微信開發(fā)平臺配置的EncodingAESKey, Token, 以及自動生成的AppID,,通過加密算法,可以驗證信息的真實性,并且將真實的信息,,解析成如明文的格式的XML,。整條信息是加密的,因此不用擔心被偽造,,否則,,會有風險,。

PS:會有怎樣的風險,?如果是Token被人猜出來進而偽造內(nèi)容,加密模式中的EncodingAESKey不會么,?還是擔心消息類型會泄露,?沒太想明白,希望路過的大神指點

不管怎么說,,加密看起來更安全些,,我現(xiàn)在做一個金融類的項目,有備無患,,就使用了加密的功能,。

代碼實現(xiàn)

微信提供了一個各種語言的解析,我在上面稍微封裝了一下:

  1. public class SignUtil {  
  2.     /** 
  3.      *  與開發(fā)模式接口配置信息中的Token保持一致 
  4.      */  
  5.     private static String token = "yourToken";  
  6.       
  7.     /** 
  8.      * 微信生成的 ASEKey 
  9.      */  
  10.     private static String encodingAesKey ="yourKey";  
  11.   
  12.     /** 
  13.      * 應用的AppId 
  14.      */  
  15.     private static String appId="yourId";  
  16.       
  17.     /** 
  18.      * 解密微信發(fā)過來的密文 
  19.      *  
  20.      * @return 加密后的內(nèi)容 
  21.      */  
  22.     public static String decryptMsg(String msgSignature,String timeStamp,String nonce,String encrypt_msg) {  
  23.         WXBizMsgCrypt pc;  
  24.         String result ="";  
  25.         try {  
  26.             pc = new WXBizMsgCrypt(token, encodingAesKey, appId);  
  27.             result = pc.decryptMsg(msgSignature, timeStamp, nonce, encrypt_msg);  
  28.         } catch (AesException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.         return result;  
  33.     }  
  34.   
  35.     /** 
  36.      * 加密給微信的消息內(nèi)容 
  37.      * @param replayMsg 
  38.      * @param timeStamp 
  39.      * @param nonce 
  40.      * @return 
  41.      */  
  42.     public static String ecryptMsg(String replayMsg,String timeStamp, String nonce) {  
  43.         WXBizMsgCrypt pc;  
  44.         String result ="";  
  45.         try {  
  46.             pc = new WXBizMsgCrypt(token, encodingAesKey, appId);  
  47.             result = pc.encryptMsg(replayMsg, timeStamp, nonce);  
  48.         } catch (AesException e) {  
  49.             // TODO Auto-generated catch block  
  50.             e.printStackTrace();  
  51.         }  
  52.         return result;  
  53.     }  

最后,,在對應POST的處理方法中調(diào)用:

  1. //request 為請求的 HttpServletRequest 參數(shù)  
  2. String encrypt_type =request.getParameter("encrypt_type");  
  3. if (encrypt_type == null || encrypt_type.equals("raw")) { //不用加密  
  4.     // 微信加密簽名    
  5.     String signature = request.getParameter("signature");    
  6.     // 時間戳    
  7.     String timestamp = request.getParameter("timestamp");    
  8.     // 隨機數(shù)    
  9.     String nonce = request.getParameter("nonce");    
  10.         
  11.     if(SignUtil.checkSignature(signature, timestamp, nonce)) {  
  12.         //業(yè)務處理方法,,返回為XML格式的結(jié)果信息 此處需要轉(zhuǎn)換一下編碼,否則中文亂碼,不知為何...   
  13.         String respMessage = new String(wxService.processRequest(request.getInputStream(),session).getBytes("UTF-8"),"ISO8859_1");    
  14.         logger.info("message:"+respMessage);  
  15.         return respMessage;        
  16.     } else {  
  17.         return "check Error";  
  18.     }  
  19. } else {//需走加解密流程      
  20.     // 微信加密簽名    
  21.     String msgSignature = request.getParameter("msg_signature");    
  22.     // 時間戳    
  23.     String timeStamp = request.getParameter("timestamp");    
  24.     // 隨機數(shù)    
  25.     String nonce = request.getParameter("nonce");  
  26.     //密文  
  27.     String encryptMsg = readLine(request.getInputStream());  
  28.     
  29.     String data = SignUtil.decryptMsg(msgSignature, timeStamp, nonce, encryptMsg);  
  30.     logger.info("parse Data is:"+data);  
  31.     if(data.length() == 0) {  
  32.         return "CheckError";  
  33.     } else {  
  34.         InputStream istream = new ByteArrayInputStream(data.getBytes());  
  35.         //業(yè)務處理方法,,返回為XML格式的結(jié)果信息  
  36.         String respMessage = wxService.processRequest(istream,session);  
  37.         logger.info("message:"+respMessage);  
  38.         String enRespMsg = SignUtil.ecryptMsg(respMessage, timeStamp, nonce);  
  39.         return enRespMsg;  
  40.     }  
  41. }  

使用上面的方法,,可以同時處理明文模式與加密模式,從真正意義上做到閑的蛋疼

如果你覺得這篇文章對你有幫助,,可以順手點個,,不但不會喜當?shù)€能讓更多人能看到它... 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多