objective c hmac sha 256给出了错误的nsdata输出

时间:2013-01-26 03:41:02

标签: objective-c nsdata wcf-security hmac

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

谢谢!

2 个答案:

答案 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