2015-12-15 5 views
2

Попытка получить дайджест с использованием HMac SHA256 с нижеследующим кодом, но каждый раз, когда он дает разные результаты.Различные данные HMac Digest генерируются каждый раз для одного входа в объекте c

Здесь ключевой параметр находится в формате 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

Вы не можете использовать strlen() для строк, отличных от "C", строки "C" - это строки с нулевым завершением, которые не содержат никаких 0x00 байт. strlen() подсчитывает до тех пор, пока не найдет первый байт 0x00, на байтах данных, которые могут быть ранними или за пределами данных, что может привести к сбою.

Вы пытаетесь трудно, нет никаких оснований для «C» массивы в стиле, просто использовать bytes член NSData и NSMutableData наряду с методом 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
входных данных, Длина: 16, данные: 32536167 61725072 61323938 33363838
Hash Mac сгенерировано: b681d2b1 251f1953 3716258c 8eeb9101 db3ecad2 c4a5077e 0cf76617 e45e5459
Hash Mac генерируется: toHSsSUfGVM3FiWMjuuRAds + ytLEpQd + DPdmF + ReVFk =
Выход HMAC дайджеста :: toHSsSUfGVM3FiWMjuuRAds + ytLEpQd + DPdmF + ReVFk =

+0

Спасибо заф. С вашим решением он работал как шарм :). Теперь я мог видеть один и тот же вывод каждый раз и спасибо за указание ошибки, которую я совершал. – Sagar

1

Невозможно использовать strlen для двоичных данных. Поскольку ключ HMAC может быть любого размера, вы можете использовать больше байтов, чем фактически содержит ключ. Если ключ изменяется каждый раз, вы получите другой результат. Вам нужно получить размер ключа от keyData, а не от cKey.

+0

Благодаря Maarten.This действительный момент, который я пропустил. – Sagar