gpt4 book ai didi

java - Android HMAC-SHA1 不同于标准 Java HMAC-SHA1

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:33:34 26 4
gpt4 key购买 nike

我在 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 程序(当然是用 System.out.println 调用替换了 Log.v 调用),这样我就可以与 android 版本进行比较。在这两种情况下,我都对 base_string 和键使用相同的测试值。

此外,我还使用一些 PHP 函数和验证服务器(使用一些 OAuth token )验证了来自标准 Java 的编码结果。该代码在标准 Java 程序中运行良好,但在 Android 程序中不起作用。我做了很多搜索,但无法弄清楚出了什么问题。有人遇到过这种情况吗?

这是标准 java 和 android 的结果...

  • Java(和 PHP):fH/+pz0J5XcPZH/d608zGSn7FKA=
  • 安卓程序:fH/vv73vv709Ce+/vXcPZH/vv73vv71PMxkp77+9FO+/vQ==

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

感谢任何帮助!

最佳答案

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

你在这里做什么?

        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 之类的东西)。

关于java - Android HMAC-SHA1 不同于标准 Java HMAC-SHA1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7047487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com