HMACSHA256計算后產生不同的結果,太坑了!!!


     雖然這個坑是自己埋的,但還是要分享一波,一是給自己一個深刻的教訓,同時也是希望在茫茫人海中,如果你也遇到我同樣的問題,能夠減少彎路,少踩坑。

     事情是這個樣子的,在一次簽名業務中,需要將簽名數據用對方簽名系統的秘鑰secret,進行HmacSHA256計算。 本地調通以后,部署測試環境后,卻發現始終無法簽名成功。

發現是因為本地和測試環境HmacSHA256計算結果不同導致。代碼如下面所示:

 1  /***
 2      * 計算請求簽名值
 3      *
 4      * @param message 待計算的消息
 5      * @param secret 密鑰
 6      * @return HmacSHA256計算后摘要值的Base64編碼
 7      * @throws Exception 加密過程中的異常信息
 8      */
 9     public static String doSignatureBase64(String message, String secret) throws Exception {
10         final String algorithm = "HmacSHA256";
11         Mac hmacSha256;
12         String digestBase64 = null;
13         try {
14             hmacSha256 = javax.crypto.Mac.getInstance(algorithm);
15             byte[] keyBytes = secret.getBytes("UTF-8");
16             byte[] messageBytes = message.getBytes("UTF-8");
17             hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm));
18             // 使用HmacSHA256對二進制數據消息Bytes計算摘要
19             byte[] digestBytes = hmacSha256.doFinal(messageBytes);
20             // 把摘要后的結果digestBytes轉換成十六進制的字符串
21             // String digestBase64 = Hex.encodeHexString(digestBytes);
22             // 把摘要后的結果digestBytes使用Base64進行編碼
23             digestBase64 = new String(Base64.encodeBase64(digestBytes), "UTF-8");
24         } catch (NoSuchAlgorithmException e) {
25             String msg = MessageFormat.format("不支持此算法: {0}", e.getMessage());
26             Exception ex = new Exception(msg);
27             ex.initCause(e);
28             throw ex;
29         } catch (UnsupportedEncodingException e) {
30             String msg = MessageFormat.format("不支持的字符編碼: {0}", e.getMessage());
31             Exception ex = new Exception(msg);
32             ex.initCause(e);
33             throw ex;
34         } catch (InvalidKeyException e) {
35             String msg = MessageFormat.format("無效的密鑰規范: {0}", e.getMessage());
36             Exception ex = new Exception(msg);
37             ex.initCause(e);
38             throw ex;
39         }
40         return digestBase64;
41     }

        然后開始百度,尋找度娘,看各種資料,網上針對此原因的回復,總結了一下,基本是以下幾種原因:

       1.獲取秘鑰secret、加密內容message二進制時沒有指定編碼,顯然代碼已指定 UTF-8編碼,此種情況排除;

       2.加密內容message含有"/n"特殊字符等導致。 這里我message故意傳入了數字字符串,即message=“123”。此種情況也排除;

       3.本地tomcate、JDK版本問題,后面經過驗證也排除了;

       4.秘鑰本地與測試環境不同。但是我眨眼一看秘鑰,測試環境:b579053cagcb421cae82751cb8c7a091、本地環境: b5790530f85b431cae8275a3b8c7a091。一樣啊。

       所以百思不得其解。 那問題究竟在哪呢?我剛說了,我是眨眼一看,作為程序員,需要的是嚴謹細致,你以為的一樣,我們在這樣對比下呢?

       測試環境 b579053cagcb421cae82751cb8c7a091

       本地環境:b5790530f85b431cae8275a3b8c7a091

       卧槽秘鑰中間幾個字符串不一樣。於是呼果斷更改了測試環境配置,后面對接成功。回頭想想,還是粗心大意呀!!

 

 

     


免責聲明!

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



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