objective c 中的相同输入每次都会生成不同的 HMac 摘要

Different HMac Digest are being generated every time for the same input in objective c

尝试使用 HMac SHA256 和以下代码获取摘要,但每次都给出不同的输出。

这里关键参数是Base64string格式,而明文参数没有任何编码。

+(NSString *)hmacWithIndicies:(NSString *)plaintext withKey:(NSString *)key {
 NSLog(@"Input text::%@",plaintext);
 NSLog(@"Input Key::%@",key);
 NSData *keyData = [[NSData alloc] initWithBase64EncodedString:key options:0];
 NSLog(@"Key Data is::%@",keyData);
 const char *cKey = (char *)[keyData bytes];

 NSLog(@"Key Length is::%lu",strlen(cKey));
 NSData *keyInData = [NSData dataWithBytes:cKey length:sizeof(cKey)];
 NSLog(@"Key data = %@", keyInData);

//Data here
 const char *cData = [plaintext cStringUsingEncoding:NSUTF8StringEncoding];
 NSLog(@"Input Length is::%lu",strlen(cData));

 NSData *dataData = [NSData dataWithBytes:cData length:sizeof(cData)];
 NSLog(@"Input data = %@", dataData);

 uint8_t cHMAC[CC_SHA256_DIGEST_LENGTH];

 CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

 NSData *hMacInData =[[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
 NSLog(@"Hash Mac data generated is %@", hMacInData);
 NSString *b64EncStrHmac = [hMacInData base64EncodedStringWithOptions:0];

 NSLog(@"Hash Mac generated is %@", b64EncStrHmac);

 return b64EncStrHmac;

}

调用上面的方法如下:-

NSString * hMacOutput= [KeyGeneration hmacWithIndicies:@"2SagarPra2983688" withKey:@"qDwki5t1SSuKER4mzSMBHXhtt+PRMCv0B2LgXaBZmgE="];

NSLog(@"Output of HMac digest::%@",hMacOutput);

hMacOutput 每次调用摘要都会导致不同的输出。

无法对二进制数据使用 strlen。由于 HMAC 的密钥可以是任何大小,因此您可能使用比密钥实际包含的字节更多的字节。如果密钥每次都更改,您将获得不同的输出。您需要从 keyData 检索密钥的大小,而不是从 cKey.

您不能在非 "C" 字符串上使用 strlen(),"C" 字符串是不包含任何 0x00 字节的空终止字符串。 strlen() 计数,直到找到第一个 0x00 字节,在可能早于或超过数据末尾的数据字节上,可能导致崩溃。

你很努力,没有理由使用 "C" 样式数组,只需使用 NSDataNSMutableDatabytes 成员以及 length方法。
[NSMutableData dataWithLength: ] 分配内存。

示例:

+(NSString *)hmacWithIndicies:(NSString *)plaintext withKey:(NSString *)key {
    NSLog(@"Input text: %@", plaintext);
    NSLog(@"Input Key:  %@", key);

    NSData *keyData = [[NSData alloc] initWithBase64EncodedString:key options:0];
    NSLog(@"keyData Length: %lu, Data: %@", keyData.length, keyData);

    NSData *inData = [plaintext dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"inData Length: %lu, Data: %@", inData.length, inData);

    NSMutableData *HMACdata = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, keyData.bytes, keyData.length, inData.bytes, inData.length, (void *)HMACdata.bytes);
    NSLog(@"Hash Mac data generated: %@", HMACdata);

    NSString *b64EncStrHmac = [HMACdata base64EncodedStringWithOptions:0];
    NSLog(@"Hash Mac generated: %@", b64EncStrHmac);

    return b64EncStrHmac;
}

输出:
输入文字:2SagarPra2983688
输入密钥:qDwki5t1SSuKER4mzSMBHXhtt+PRMCv0B2LgXaBZmgE=
keyData长度:32,数据:a83c248b 9b75492b 8a111e26 cd23011d 786db7e3 d1302bf4 0762e05d a0599a01
in数据长度:16,数据:32536167 61725072 61323938 33363838
生成哈希 Mac 数据:b681d2b1 251f1953 3716258c 8eeb9101 db3ecad2 c4a5077e 0cf76617 e45e5459
生成哈希 Mac:toHSsSUfGVM3FiWMjuuRAds+ytLEpQd+DPdmF+ReVFk=
HMacdigest::toHSsSUfGVM3FiWMjuuRAds+ytLEpQd+DPdmF+ReVFk=

的输出