在目标 C 中创建 HMAC,其中 NSData 是二进制值解码的 B64,密钥是非二进制值



我有一个无法解决的问题。我需要在目标 C 中执行 HMAC(SHA256(,其中密钥是 NSString,数据是解码的 B64。找到了很多数据是UTFEn编码字符串的例子,它也对我有用。但是,在我的情况下,解码的 B64 转换为二进制值然后我必须对其执行 HMAC 时会遇到问题。

-(void)copyAndPlay{
NSString *eB64 = @"fek3l4fnvn44fj43jfjk3l4ff2c33wA=";
NSData *data = [[NSData alloc] initWithBase64EncodedStringB64 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)];
NSLog(@"HMAC:");}

因此,我能够使用 eB64 执行 b64 方法以 *数据并将其发送回 b64E 并验证它是否正常。对我来说,下面的 CCHmac 函数似乎没有任何问题,*HMAC 应该包含正确的值。但是,当我将其与有效的 Python 代码进行比较时,HMAC 的内容 - 在 lldb 中通过"我读取"[HMAC 字节]"不匹配。但是,当我使用以与cKey相同的方式投射到dKey的NSString时,我在obj-c和python中都得到了相同的结果。我一定做错了什么,但不确定是什么。

如果密钥已经是 NSData,为什么要将其转换为字符串?HMAC 算法适用于数据,而不是字符串。假设testKey是表示密钥的NSData

NSData *data = [[NSData alloc] initWithBase64EncodedString:apiSecret options:0];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, testKey.bytes, testKey.length, data.bytes, data.length, cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

但这不是"2 个值的 SHA256 哈希"。这是使用密钥data的HMAC,这是完全不同的。

最新更新