我想用HmacSHA256加密一个带有密钥的字符串。每个人都在使用下面的代码,但是有一件事是没有意义的。如果我们想要的只是HmacSHA256散列,为什么我们最后还要使用base64呢?
我尝试查看在调用方法CCHmac之后生成的散列
NSString *str = [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);但是我没有得到生成的散列,我得到的是null,或者垃圾,就像这样:
2011-10-11 09:38:05.082 Hash_HmacSHA256368:207 2011-10-11 09:38:05.085 Hash_HmacSHA256368:207 Rwªb7is M`f{yy M`f§(&oáananualalotialRanduranM`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];发布于 2011-10-11 18:50:25
首先,对于那些想知道的人来说,这是关于我对这个问题的回答:Objective-C sample code for HMAC-SHA1
您生成的HMAC是一个256位二进制值,它可能以0字节开头,也可能不以0字节开头。
为了能够打印它,您需要一个字符串表示(二进制、十六进制、十进制、base64等)。Base64是其中最高效的,这就是为什么我在那里使用Base64编码的原因。
得到垃圾信息的原因是HMAC值中的大多数(如果不是全部)八位字节都在可打印的ASCII字符范围之外。如果第一个二进制八位数是0 (0x00),则得到nil。这就是为什么您需要支持任意值的编码。ASCII不需要。
当然,如果您不想打印HMAC值,那么可能不需要这样的编码,并且可以保持HMAC不变(二进制NSData)。
发布于 2011-10-12 18:03:07
我花了一整天的时间,试图将生成的哈希(字节)转换成可读的数据。我使用了你说的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);发布于 2012-07-14 04:24:32
不要使用"out description“来获取字符串形式的散列。
执行散列base64Encoding以获得它的base64编码。使用http://cybersam.com/ios-dev/http-basic-access-authentication-with-objective-c-and-ios/attachment/nsdataadditions获取base64Encoding函数。additions类是一个类别,它将函数base64Encoding添加到NSData的实现中。
或者你可以做[NSUTF8StringEncoding][NSUTF8StringEncoding]。
https://stackoverflow.com/questions/7723469
复制相似问题