HmacSHA256 objective-c加密

时间:2011-10-11 08:49:07

标签: iphone objective-c encryption sha256 hmac

我想使用HmacSHA256用钥匙包裹一个字符串。每个人使用的代码都是下面的代码,但有一件事没有意义。 如果我们想要的只是HmacSHA256哈希,为什么我们最终会使用base64?

我尝试看到在使用

调用方法CCHmac之后生成的哈希
NSString *str = [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);

但是我没有得到哈希值,我得到null或者垃圾,就像这样:

2011-10-11 09:38:05.082 Hash_HmacSHA256 [368:207](null) 2011-10-11 09:38:05.085 Hash_HmacSHA256 [368:207]Rwªb7iså{yyþ§Ù(&oá÷ÛË¥M`f

import < CommonCrypto/CommonHMAC.h>

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);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                  length:sizeof(cHMAC)];

NSString *hash = [HMAC base64Encoding]; //This line doesn´t make sense

[key release];
[data release];

3 个答案:

答案 0 :(得分:8)

首先,对于那些想知道的人,这是关于我对这个问题的回答:Objective-C sample code for HMAC-SHA1


您生成的HMAC是一个256位二进制值,可能是也可能不是以0字节开头。

为了能够打印它,您需要一个字符串表示(二进制,十六进制,十进制,base64等)。 Base64是其中最有效的之一,这就是我在那里使用Base64编码的原因。

您获得垃圾的原因是HMAC值中的大多数(如果不是全部)八位字节都在可打印的ASCII字符范围之外。如果第一个八位位组为0(0x00),则为零。这就是您需要支持任意值的编码的原因。 ASCII没有。

当然,如果你不想打印HMAC值,那么可能不需要这样的编码,并且可以保持HMAC不变(二进制NSData)。

答案 1 :(得分:2)

我花了一整天时间,尝试将生成的哈希(字节)转换为可读数据。我使用了你说过的base64编码,它对我来说根本不起作用。

所以我做的是这个:

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

// Now convert to NSData structure to make it usable again
NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];

// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);

答案 2 :(得分:1)

不要“[out description]”将哈希作为字符串。

执行[hash base64Encoding]以获取它的base64编码。使用http://cybersam.com/ios-dev/http-basic-access-authentication-with-objective-c-and-ios/attachment/nsdataadditions获取base64Encoding函数。 additions类是一个将函数base64Encoding添加到NSData实现的类别。

或者你可以[[NSString alloc] initWithData:out encoding:NSUTF8StringEncoding]。