Precisa gerar o hash HMAC SHA256 no Objetivo C como em Java

Eu preciso gerar um hash usando HMAC SHA256. Eu estou usando o seguinte código em Java. Eu preciso de um código equivalente no Objective-C.

javax.crypto.Mac mac = javax.crypto.Mac.getInstance(type); javax.crypto.spec.SecretKeySpec secret = new javax.crypto.spec.SecretKeySpec(key.getBytes(), type); mac.init(secret); byte[] digest = mac.doFinal(value.getBytes()); StringBuilder sb = new StringBuilder(digest.length * 2); String s=""; for (byte b: digest) { s = Integer.toHexString(b); if (s.length() == 1) { sb.append('0'); } sb.append(s); } return sb.toString(); 

Chave = YARJSuwP5Oo6/r47LczzWjUx/T8ioAJpUK2YfdI/ZshlTUP8q4ujEVjC0seEUAAtS6YEE1Veghz+IDbNQb+2KQ==

Valor =

id=456|time=19:10|nonce=8

Saída =

 4effffffd8ffffffce7cffffffc4ffffffc71b2f72ffffffdc21ffffffa1ffffffe0ffffffe62d32550b0771296bffffff9c1159ffffffdeffffff8675ffffff9928654c 

Eu tenho essa function Objective-C:

  //Hash method Definition - (NSString *)getHashEncription:(NSString *)key andData:(NSString *)data{ NSLog(@"Secret Key %@ And Data %@", key, data); const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; //HmacSHA256 CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)]; [Base64 initialize]; NSString *b64EncStr = [Base64 encode:HMAC]; NSLog(@"Base 64 encoded = %@",b64EncStr); NSLog(@"NSData Value %@", HMAC); // unsigned char hashedChars[32]; // NSString *inputString; // inputString = [NSString stringWithFormat:@"hello"]; // NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding]; // CC_SHA256(inputData.bytes, inputData.length, hashedChars); return [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding]; }//End of getHashEncription 

A saída que estou recebendo é esta:

 8736bc4aa7fc3aa071f2b4262b6972a89d2861559a20afa765e46ff17cb181a9 

Eu tentei remover a codificação base64, mas não funcionou.

Quaisquer sugestões são muito bem vindas.

Você precisa corrigir a sua impressora Java hmac, porque 4effffffd8ffffffce7cffffffc4ffffffc71b2f72ffffffdc21ffffffa1ffffffe0ffffffe62d32550b0771296bffffff9c1159ffffffdeffffff8675ffffff9928654c não é válido. Todos aqueles ffffff lá são uma oferta que você está estendendo o sinal dos bytes para inteiros assinados de 32 bits antes de convertê-los em hexadecimais. Presumivelmente, o hmac correto é 4ed8ce7cc4c71b2f72dc21a1e0e62d32550b0771296b9c1159de86759928654c .

De qualquer forma, eu suspeito que você esteja chamando seu método incorretamente. Copiei seu código em um programa de teste que me fornece essa saída para sua chave e dados:

 2011-12-10 13:03:38.231 hmactest[8251:707] test hmac = <4ed8ce7c c4c71b2f 72dc21a1 e0e62d32 550b0771 296b9c11 59de8675 9928654c> 

Isso corresponde à saída desejada (exceto pelos erros de extensão de sinal).

Aqui está o meu programa de teste:

 #import  #import  NSData *hmacForKeyAndData(NSString *key, NSString *data) { const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); return [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)]; } int main (int argc, const char * argv[]) { @autoreleasepool { // Compare to http://en.wikipedia.org/wiki/HMAC#Examples_of_HMAC_.28MD5.2C_SHA1.2C_SHA256_.29 NSLog(@"empty hmac = %@", hmacForKeyAndData(@"", @"")); NSLog(@"test hmac = %@", hmacForKeyAndData(@"YARJSuwP5Oo6/r47LczzWjUx/T8ioAJpUK2YfdI/ZshlTUP8q4ujEVjC0seEUAAtS6YEE1Veghz+IDbNQb+2KQ==", @"id=456|time=19:10|nonce=8")); } return 0; } 

Linha

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

tem um bug

Se em sua chave seria 0x00 byte strlen(cKey) daria comprimento errado e processo de geração de hmac irá produzir algum lixo.

Na minha implementação eu mudei isso para:

 CCHmac(kCCHmacAlgSHA256, cKey, [key length], cData, [data length], cHMAC);