You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Objective-C中对Base64解码二进制数据计算HMAC-SHA256遇问题求助

解决Objective-C中Base64解码数据的HMAC-SHA256计算问题

看起来你的代码逻辑本身是正确的,问题很可能出在HMAC结果的对比方式上——你用LLDB查看原始字节,而Python输出的大概率是十六进制字符串,两者展示形式不同导致你误以为结果不一致。下面是具体的验证和修正步骤:

1. 修正Objective-C代码,输出可读的十六进制结果

你当前的代码只打印了"HMAC:",没有输出实际的HMAC值。添加一个辅助方法把NSData转换成十六进制字符串,这样就能和Python的结果直接对比:

- (NSString *)hexStringFromData:(NSData *)data {
    NSMutableString *hexStr = [NSMutableString stringWithCapacity:data.length * 2];
    const unsigned char *byteBuffer = (const unsigned char *)data.bytes;
    for (NSInteger i = 0; i < data.length; i++) {
        [hexStr appendFormat:@"%02x", byteBuffer[i]];
    }
    return hexStr;
}

-(void)copyAndPlay{
 NSString *eB64 = @"fek3l4fnvn44fj43jfjk3l4ff2c33wA=";
 NSData *data = [[NSData alloc] initWithBase64EncodedString:eB64 options:0];
 NSString *b64E = [data base64EncodedStringWithOptions:0];
 NSLog(@"Sanity:: %@", b64E);
 NSString *key = @"thisisatestkey";
 const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
 unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
 CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), data.bytes, data.length, cHMAC);
 NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
 // 输出十六进制格式的HMAC结果
 NSLog(@"HMAC Hex: %@", [self hexStringFromData:HMAC]);
}

2. 用Python生成正确的对比结果

确保你的Python代码逻辑和Objective-C完全对齐,基于二进制数据计算:

import hmac
import hashlib
import base64

# 和OC中一致的Base64字符串
eB64 = "fek3l4fnvn44fj43jfjk3l4ff2c33wA="
# 解码成二进制数据
data = base64.b64decode(eB64)
# 密钥转成UTF-8二进制(和OC中[key cStringUsingEncoding:NSUTF8StringEncoding]一致)
key = b"thisisatestkey"
# 计算HMAC-SHA256并输出十六进制结果
hmac_result = hmac.new(key, data, hashlib.sha256).hexdigest()
print("Python HMAC Hex:", hmac_result)

3. 验证结果一致性

运行修正后的OC代码和上述Python代码,两者输出的十六进制字符串应该完全一致。

为什么之前会出现差异?

你用LLDB查看的是cHMAC数组的原始字节值(比如单个字节的十进制/十六进制),而Python的hexdigest()输出的是连续的十六进制字符串,两者只是展示形式不同,实际二进制数据是一致的。之前用NSString转换的数据时,你可能是把字符串转成了相同格式对比,所以结果一致。

另外,再确认你的CCHmac调用参数完全没问题:

  • 密钥的UTF-8编码和长度(strlen(cKey))正确,因为thisisatestkey是纯ASCII字符,UTF-8编码无异常
  • Base64解码后的data正确(你已经通过编码回Base64验证过)
  • 算法指定为kCCHmacAlgSHA256正确

内容的提问来源于stack exchange,提问作者Dusko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:42:11