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

我有一个Cocoa应用程序将一些数据连同该数据的SHA1哈希发送到Rails应用程序,该应用程序validation数据和哈希匹配,但它们没有。

为了确保我已经在Rails和Cocoa端记录了散列到控制台的数据的hex版本,并且它们完全匹配。

这是cocoa部分:

#import  //... - (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 

cocoa:

 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" 

发现错误,愚蠢的小事:

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

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