2011-08-12 81 views
6

我在android上遇到了一些HMAC問題。我正在使用以下代碼在搜索android hmac-sha1時出現在網絡上的SHA1算法。與標準Java HMAC-SHA1不同的Android HMAC-SHA1

 String base_string = "This is a test string"; 
     String key = "testKey"; 
     try { 
      Mac mac = Mac.getInstance("HmacSHA1"); 
      SecretKeySpec secret = new SecretKeySpec(key.getBytes("UTF-8"), mac.getAlgorithm()); 
      mac.init(secret); 
      byte[] digest = mac.doFinal(base_string.getBytes()); 

      String enc = new String(digest); 

      // Base 64 Encode the results 
      String retVal = Base64.encodeBase64String(enc.getBytes()); 
      Log.v(TAG, "String: " + base_string); 
      Log.v(TAG, "key: " + key); 
      Log.v(TAG, "result: " + retVal); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

爲了測試此代碼我創建了它一個簡單的標準的Java程序(更換Log.v與課程的System.out.println電話通話中),所以我可以比較與Android版本。在這兩種情況下,我使用base_string和key的相同測試值。

另外,我已經通過一些PHP函數和驗證服務器(使用一些OAuth令牌)驗證了標準Java的編碼結果。該代碼在標準Java程序中運行良好,但在Android程序中無法運行。我做了很多搜索,並找不出錯在哪裏。任何人都經歷過這個?

下面是標準的Java和Android的結果...

  • Java語言(PHP):fH/+pz0J5XcPZH/d608zGSn7FKA=
  • 的Android計劃:fH/vv73vv709Ce+/vXcPZH/vv73vv71PMxkp77+9FO+/vQ==

尋找到它多一點我確定它是hmac函數,而不是Base64編碼,因爲比較這些hmac值,Android版本有各種額外空間和其他未知字符符號與Java程序相混淆。

任何幫助表示讚賞!

+1

找不到方法'android.util.Base64.encodeBase64String(...)' –

回答

13

我想這是一個字符串編碼問題。

你在這裏做什麼?

 String enc = new String(digest); 

     // Base 64 Encode the results 
     String retVal = Base64.encodeBase64String(enc.getBytes()); 

您將一個字符串中的字節,然後再次返回到一個字節數組(然後您base-64編碼)。

相反,這樣做:

 String retVal = Base64.encodeBase64String(digest); 

一般來說,從來沒有用戶String.getBytes()或者如果你想要一個便攜式程序new String(byte[])。永遠不要嘗試將任意字節數組(不是字符串之前)轉換爲字符串(除了Base64之外)。

+0

哇!很簡單!我知道這將是這樣的事情,但我真的在撓撓我的腦袋。謝謝!這立即解決了問題。 – nlbers

+0

+ 1爲一個很好的答案:) –

+1

你在哪裏找到方法encodeBase64String()?我在任何地方都找不到它。 – Gabrielle

相關問題