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" 样式数组,只需使用 NSData
和 NSMutableData
的 bytes
成员以及 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=
的输出
尝试使用 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" 样式数组,只需使用 NSData
和 NSMutableData
的 bytes
成员以及 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=