2015-12-15 36 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

相關問題