所以终于想出了如何进行hmac sha 256散列。我将使用它来制作一个wcf服务api。我的问题是我的方法发出的NSData输出有空格。
例如。这就是我的API发送的样子
“2efb00aba01a3f5b674fba3063b43fee7a9356947118 ......”
这就是我的iphone应用程序显示的方式
< 2efb00ab a01a3f5b 674fba30 .....>
这就是我在目标c中的代码的样子:
NSData *hmacSHA256(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)];
}
这来自这个答案:
https://stackoverflow.com/a/8459123/639713
无论如何,我的问题是,我该如何处理这个问题。如何将NSdata输出转换为字符串?如果转换为字符串,我猜测输出将与WCF服务API发送的不同。我是否更改了API处理hmacsha256输出的方式?
谢谢!
答案 0 :(得分:6)
您可以稍微修改您的方法,以便创建一个将字节格式化为十六进制的字符串,而不是创建包含摘要字节的NSData。
NSString *hmacSHA256(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);
NSMutableString *result = [NSMutableString string];
for (int i = 0; i < sizeof cHMAC, i++)
{
[result appendFormat:@"%02hhx", cHMAC[i]];
}
return result;
}
答案 1 :(得分:1)
<2efb00ab a01a3f5b 674fba30.....>
看起来是调用-[NSData description]
的结果,就像NSLog
会对任何%@
格式字符串一样。 NSData
本身表示一个字节序列。您之后的输出似乎是字节序列作为十六进制字符串。有关如何将NSData
序列化为该格式,请参见Best way to serialize an NSData into a hexadeximal string。