objective-c - 带有 kCCHmacAlgSHA1 的 CCHmac 输出长度不一致

标签 objective-c c oauth hmac

我正在为 iOS 开发一个 oauth 库,大约 10% 到 15% 的请求都失败了,因为我的库生成的 oauth_signature 不正确。我已将问题追溯到 CCHmac() 返回意外结果。当 hmac 散列的长度不正确时,签名会失败。为了验证这个问题,我运行了这段代码:

NSString *key = @"25f108b539761bd43b6c66b64fb191c8";

for (int i = 0; i < 25; i++) {
    unsigned int chunks[4] = {
        arc4random() % ((int) pow(256, 4)),
        arc4random() % ((int) pow(256, 4)),
        arc4random() % ((int) pow(256, 4)),
        arc4random() % ((int) pow(256, 4))
    };

    // Generate a random input string of 32 hex chars
    NSString *input = [NSString stringWithFormat:@"%08x%08x%08x%08x", chunks[0], chunks[1], chunks[2], chunks[3]];

    unsigned char output[CC_SHA1_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA1, key.UTF8String, key.length, input.UTF8String, input.length, output);

    NSLog(@"HMAC Hash Length: %02lu", strlen(output));
}

...并得到了这个输出:

2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 40
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 20
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 35
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 20
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 24
2013-12-06 16:05:24.797 ODB[98281:70b] HMAC Hash Length: 41

这种 hmac 哈希方法似乎被普遍接受,因此我希望看到一致的输出长度。我错过了什么?

最佳答案

如果我没记错的话,CCHmac 以二进制形式输出它的结果,所以当这个函数完成时,output[] 应该总是恰好 20 个字节。

回想一下,strlen() 只是遍历内存,直到它找到一个“空”字节,例如

int strlen(char *s)
{
  for(int n = 0; s[n] != 0; s++)
  {
    n++;
  }
  return n;
}

因此,如果 output[] 中的一个字节碰巧是 0,那么你的 NSLog 语句将打印出一个小于 20 的值。否则,strlen() 将继续搜索未定义的内存区域,直到它碰巧在某处找到 0 的值。您将获得很大程度上不可预测的结果,这实际上可能会使您的程序崩溃。

相反,您可能期待 HMAC 的十六进制字符串表示。要获得一个,您可以执行以下操作:

NSMutableString *hexOutput = [NSMutableString string];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
    [hexOutput appendFormat:@"%02x", output[i]];
}

关于objective-c - 带有 kCCHmacAlgSHA1 的 CCHmac 输出长度不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20433662/

相关文章:

objective-c - 如何创建一个使用固定图像且没有箭头的 NSPopUpButton?

objective-c - Xcode 4.5 Interface Builder 为 Outlets 添加下划线

iphone - 在 iOS 中调用 Google Toolbox for Mac NSString 类别方法时无法识别的选择器

c - 在 C 中将 strsep() 与动态字符串数组一起使用

c - 错误 - 下标值既不是数组也不是指针也不是 vector

c - 如何从 c 调用 opaque_wrapper 结构?

Facebook OAuth 登录 - access_token API 返回 "This authorization code has been used"

oauth - 如果我正在构建一个通过 Oauth 进行身份验证的应用程序,那么使用 cookie 进行 session 是否有意义?

authentication - 如何使用 REST API 通过 OAuth2 和 React Native 进行身份验证?

ios - 从 viewDidAppear 呈现时,模态弹出框 Controller 不显示其内容