2015-12-15 37 views
2

尝试使用下面的代码使用HMac SHA256来获取摘要,但每次都会给出不同的输出。对于目标c中的相同输入,每次都会生成不同的HMac摘要。

这里的关键参数是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摘要是每次被调用时产生不同的输出。

回答

1

对于非“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
INDATA长度:16,数据:32536167 61725072 61323938 33363838
哈希Mac生成的数据:b681d2b1 251f1953 3716258c 8eeb9101 db3ecad2 c4a5077e 0cf76617 e45e5459
哈希的Mac生成:toHSsSUfGVM3FiWMjuuRAds + ytLEpQd + DPdmF + ReVFk =
输出HMAC消化的:: toHSsSUfGVM3FiWMjuuRAds + ytLEpQd + DPdmF + ReVFk =

+0

谢谢zaph。用你的解决方案它就像一个魅力:)。现在我可以每次看到相同的输出,并感谢指出我正在提交的错误。 – Sagar

1

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

+0

由于Maarten.This是我错过了一个有效点。 – Sagar

相关问题