gpt4 book ai didi

java - 我如何在 Java (Android) 中编写这个 Objective-C Hmac 签名函数?

转载 作者:行者123 更新时间:2023-11-30 09:18:56 26 4
gpt4 key购买 nike

我正在将 iOS 应用程序的一部分移植到 Android,但我无法将 iOS 中的以下签名生成代码移植到 Android。 iOS 代码是:

+ (NSString *)hashedBase64ValueOfData:(NSString *) data WithSecretKey:(NSString*)secret {
// ascii convirsion
const char *cKey = [secret cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

// HMAC Data structure initializtion
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

// Gerating hased value
NSData *da = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

return [da base64EncodedString];// conversion to base64 string & returns
}

我编写并尝试过的 Android Java 代码是:

private static String hashedBase64ValueOfDataWithSecretKey(String data, String secret) {
try {
SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(), HMAC_SHA1_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
return Base64.encodeToString(rawHmac, 0);

} catch (Exception e) {
e.printStackTrace();
}

return null;
}

经测试,Android 函数输出的内容与 iOS 函数不同(给定相同的输入),我不确定为什么。

最佳答案

不是这方面的专家,但是 NSASCIIStringEncoding 似乎暗示您希望将 datasecret 解释为 ASCII,而 String .getBytes() 默认使用默认字符集(即 UTF-8)。

您可能需要 use a different charset :

data.getBytes(StandardCharsets.US_ASCII);
secret.getBytes(StandardCharsets.US_ASCII);

对于 Java 1.7 之前的版本,您需要使用它并捕获 UnsupportedEncodingException:

data.getBytes("US-ASCII");
secret.getBytes("US-ASCII");

关于java - 我如何在 Java (Android) 中编写这个 Objective-C Hmac 签名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241003/

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