需要在Objective C中生成HMAC SHA256哈希,就像在Java中一样

我需要使用HMAC SHA256生成哈希。 我在Java中使用以下代码。 我需要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(); 

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

价值=

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

输出=

 4effffffd8ffffffce7cffffffc4ffffffc71b2f72ffffffdc21ffffffa1ffffffe0ffffffe62d32550b0771296bffffff9c1159ffffffdeffffff8675ffffff9928654c 

我有这个Objective-Cfunction:

  //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 

我得到的输出是这样的:

 8736bc4aa7fc3aa071f2b4262b6972a89d2861559a20afa765e46ff17cb181a9 

我尝试删除base64编码,但它没有工作。

任何建议都是最受欢迎的。

您需要修复Java hmac打印机,因为4effffffd8ffffffce7cffffffc4ffffffc71b2f72ffffffdc21ffffffa1ffffffe0ffffffe62d32550b0771296bffffff9c1159ffffffdeffffff8675ffffff9928654c 所有那些ffffff都有一个赠品,你可以将字节扩展为32位有符号整数,然后再转换为hex。 据推测,正确的hmac是4ed8ce7cc4c71b2f72dc21a1e0e62d32550b0771296b9c1159de86759928654c

无论如何,我怀疑你错误地调用了你的方法。 我将您的代码复制到一个测试程序中,该程序为您的密钥和数据提供了此输出:

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

这符合您所需的输出(符号扩展错误除外)。

这是我的测试程序:

 #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; } 

线

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

有一个错误

如果你的密钥将是0x00字节strlen(cKey)会给出错误的长度和hmac生成过程会产生一些垃圾。

在我的实现中,我已将其更改为:

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