Rails和Cocoa应用程序之间的SHA1哈希值不匹配

14

我有一个Cocoa应用程序将一些数据与该数据的SHA1哈希值发送到一个Rails应用程序中,以验证数据和哈希值是否匹配,但它们不匹配。

为了确保,我已经在Rails和Cocoa两端将被散列的数据的十六进制版本记录到控制台上,并且它们完全相同。

这是Cocoa部分的代码:

#import <CommonCrypto/CommonDigest.h>

//...

- (NSData *)dataOfSHA1Hash
{
    unsigned char hashBytes[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1([self bytes], CC_SHA1_DIGEST_LENGTH, hashBytes);

    return [NSData dataWithBytes:hashBytes length:CC_SHA1_DIGEST_LENGTH];
}

//...

NSData *signatureData = [signedData dataOfSHA1Hash];
NSString *signature = [signatureData hexadecimalString];

...以及 Rails:

Digest::SHA1.hexdigest(signed_data)
请注意,-hexadecimalString是一个NSData的自定义扩展(似乎不是内置的),我已经测试过了。那个方法似乎不是问题所在。
那么,为什么相同数据的SHA1哈希值不匹配?有什么想法吗?
编辑:示例
对于字符串“Hello World!”
Cocoa:f98ee9c814c2f3c66ccdca641298d12cd26741ec Rails:2ef7bde608ce5404e97d5f042f95f89f1c232871
NSMutableData *signedData = [[NSMutableData alloc] init];
[signedData appendData:[@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding]];

NSData *signatureData = [signedData dataOfSHA1Hash];
[signedData release];
NSString *signature = [signatureData hexadecimalString];

NSLog(@"Signature: %@", signature);
// output: Signature: f98ee9c814c2f3c66ccdca641298d12cd26741ec

Ruby:

>> Digest::SHA1.hexdigest("Hello World!")
=> "2ef7bde608ce5404e97d5f042f95f89f1c232871"

你能否发布一个样本数据和摘要,以便我们可以看出哪个是不正确的? - cobbal
2
顺便说一句 - 我刚在我的iPhone应用程序中发现了同样的问题。CC_SHA1没有返回与Python hashlib.sha1相同的哈希值。我也没有像sjmulder那样遇到相同的错误长度传递问题,这是因为仅仅改用OpenSSL SHA1()实现而不是CC_SHA1()就可以解决问题。没有改变参数或任何东西,只是调用计算哈希的函数不同。非常奇怪和令人担忧的是,CC_SHA1()似乎存在缺陷。 - glenc
我曾经遇到过类似的错误,但在我的情况下,我使用数据指针本身作为CC_SHA1的第一个参数。我应该使用[data bytes]。花费了令人尴尬的长时间才弄清楚这一点。 - Ben Scheirman
1个回答

8

找到错误了,是个小问题:

-CC_SHA1([self bytes], CC_SHA1_DIGEST_LENGTH, hashBytes);
+CC_SHA1([self bytes], [self length], hashBytes);

我发送的是摘要的长度而不是数据的长度。不知道我怎么会犯这样的错误,然后还忽视了几个小时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接