2011-08-12 108 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