【发布时间】:2016-01-09 21:21:08
【问题描述】:
我需要使用 HMAC-SHA1 对 NSData 输入进行哈希处理。我使用了这段代码:
- (NSString *)HMACSHA1:(NSData *)data {
NSParameterAssert(data);
const char *cKey = [@"SampleSecretKey012345678" cStringUsingEncoding:NSUTF8StringEncoding];
const void *cData = [data bytes];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];\
/* Returns hexadecimal string of NSData. Empty string if data is empty. */
const unsigned char *dataBuffer = (const unsigned char *)[HMAC bytes];
if (!dataBuffer) {
return [NSString string];
}
NSUInteger dataLength = [HMAC length];
NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
for (int i = 0; i < dataLength; ++i) {
[hexString appendFormat:@"%02x", (unsigned int)dataBuffer[i]];
}
return [NSString stringWithString:hexString];
}
但是十六进制字符串输出总是错误的(从服务器检查)。我认为问题在于这一行:
const void *cData = [data bytes];
因为如果以与键相同的方式转换数据(示例“测试”字符串):
const void *cData = [@"test" cStringUsingEncoding:NSUTF8StringEncoding];
然后使用此页面查看结果:HMAC crypt,结果匹配。
如果我散列一个 NSString,那么我可以使用 cStringUsingEncoding:,但我无法将 NSData 转换为 const void*。任何人都可以帮助我吗?谢谢!
【问题讨论】:
标签: objective-c encryption hmac