【问题标题】:Android HMAC-SHA1 Different than Standard Java HMAC-SHA1Android HMAC-SHA1 与标准 Java HMAC-SHA1 不同
【发布时间】:2011-10-26 05:23:12
【问题描述】:

我在 android 上遇到了一些 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=
  • 安卓程序:fH/vv73vv709Ce+/vXcPZH/vv73vv71PMxkp77+9FO+/vQ==

再深入研究一下,我确定这是 hmac 函数,而不是 Base64 编码,因为比较那些 hmac 值,Android 版本与 Java 相比,有各种额外的空格和其他未知字符符号。程序。

感谢任何帮助!

【问题讨论】:

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

标签: java android sha1 hmac


【解决方案1】:

我想这是一个字符串编码问题。

你在这里做什么?

        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 之类的除外)。

【讨论】:

  • 哇!很简单!我知道它会是那样的,但我真的摸不着头脑。谢谢!这立即解决了问题。
  • 在哪里可以找到方法 encodeBase64String()?我在任何地方都找不到。
  • @Gabrielle:我只是从问题中复制了这一部分,我不知道这里使用了哪个 base64-library。但它们都应该给出相同的结果,因为这是一个明确指定的算法。
  • 即使我下载包 org.apache.commons.codec.binary.Base64 并将其添加到我的项目中,我总是得到 java.lang.NoSuchMethodError: org.apache.commons.codec.binary .Base64.encodeBase64String。我找不到错误在哪里。
  • 最终我使用了android.util.Base64.encode(digest, Base64.DEFAULT)
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多