2

所以终于想出了如何进行 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 输出的方式?

谢谢!

4

2 回答 2

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;
}
于 2013-01-26T04:02:37.243 回答
1

<2efb00ab a01a3f5b 674fba30.....>看起来像调用的结果-[NSData description],就像NSLog对任何%@格式字符串一样。它NSData本身代表一个字节序列。您之后的输出似乎是作为十六进制字符串的字节序列。有关如何将 NSData 序列化为该格式的信息,请参阅将 NSData 序列化为十六进制字符串的最佳方法NSData

于 2013-01-26T04:01:37.793 回答