我有一个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"
CC_SHA1
的第一个参数。我应该使用[data bytes]
。花费了令人尴尬的长时间才弄清楚这一点。 - Ben Scheirman