Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails SHA1哈希在我的Rails和Cocoa应用程序之间不匹配_Ruby On Rails_Objective C_Ruby_Cocoa_Sha1 - Fatal编程技术网

Ruby on rails SHA1哈希在我的Rails和Cocoa应用程序之间不匹配

Ruby on rails SHA1哈希在我的Rails和Cocoa应用程序之间不匹配,ruby-on-rails,objective-c,ruby,cocoa,sha1,Ruby On Rails,Objective C,Ruby,Cocoa,Sha1,我让一个Cocoa应用程序将一些数据连同该数据的SHA1散列一起发送到Rails应用程序,该应用程序验证数据和散列是否匹配,但它们不匹配 为了确保我已经记录了在Rails和Cocoa端散列到控制台的数据的十六进制版本,并且它们完全匹配 以下是可可部分: #import <CommonCrypto/CommonDigest.h> //... - (NSData *)dataOfSHA1Hash { unsigned char hashBytes[CC_SHA1_DIGEST

我让一个Cocoa应用程序将一些数据连同该数据的SHA1散列一起发送到Rails应用程序,该应用程序验证数据和散列是否匹配,但它们不匹配

为了确保我已经记录了在Rails和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];
注意,-hexadecimalString是NSData的自定义扩展(似乎没有内置),我已经测试过了。这种方法似乎不是问题所在

那么,为什么我的SHA1散列不匹配相同的数据?有什么想法吗

编辑:示例

为字符串“你好,世界!”

红宝石:


发现了错误,愚蠢的小东西:

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

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

你能发布一个样本数据和摘要,让我们看看哪个是错误的吗?FWIW-我刚刚在我的iPhone应用程序中发现了同样的问题。CC_SHA1返回的哈希值与Python hashlib.SHA1返回的哈希值不同。我也没有像sjmulder一样出现错误的长度传递问题,事实证明,简单地改变使用OpenSSL SHA1()实现而不是CC_SHA1()实际上就解决了这个问题。没有改变参数或任何东西,只是我调用了哪个函数来计算散列。非常奇怪,令人担忧的是CC_SHA1()似乎有缺陷。我也有类似的缺陷,但是在我的例子中,我使用数据指针本身作为
CC_SHA1
的第一个参数。我应该使用
[数据字节]
。这件事花了很长时间才弄明白。 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
>> Digest::SHA1.hexdigest("Hello World!")
=> "2ef7bde608ce5404e97d5f042f95f89f1c232871"
-CC_SHA1([self bytes], CC_SHA1_DIGEST_LENGTH, hashBytes);
+CC_SHA1([self bytes], [self length], hashBytes);