在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
相关产品推荐
相关产品推荐

