【问题标题】:objective c hmac sha 256 gives wrong nsdata output目标 c hmac sha 256 给出错误的 nsdata 输出
【发布时间】:2013-01-26 12:02:38
【问题描述】:

所以终于想出了如何进行 hmac sha 256 散列。我将把它用于我制作的 wcf 服务 api。我的问题是我的方法发出的 NSData 输出有空格。

例如。这就是我的 API 发出的样子

“2efb00aba01a3f5b674fba3063b43fee7a9356947118……”

这就是我的 iphone 应用程序的显示方式

这就是我在目标 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 输出的方式?

谢谢!

【问题讨论】:

标签: objective-c nsdata wcf-security hmac


【解决方案1】:

您可以稍微修改您的方法,以便创建一个将字节格式化为十六进制的字符串,而不是创建一个包含摘要字节的 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;
}

【讨论】:

  • 就是这样!我刚刚看到我的 wcf 服务做了同样的事情 >> for (int i = 0; i
  • 非常感谢!刚刚遇到同样的问题,这完美地解决了它!
【解决方案2】:

&lt;2efb00ab a01a3f5b 674fba30.....&gt; 看起来像调用-[NSData description] 的结果,就像NSLog 对任何%@ 格式字符串所做的那样。 NSData 本身代表一个字节序列。您之后的输出似乎是作为十六进制字符串的字节序列。请参阅Best way to serialize an NSData into a hexadeximal string 了解如何将NSData 序列化为该格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 2012-07-07
    • 2020-11-15
    • 2013-01-09
    • 2021-11-25
    • 2021-08-05
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多