我想使用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];
答案 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]。