14

Cocoa アプリにそのデータの SHA1 ハッシュと共にデータを Rails アプリに送信させて、データとハッシュが一致することを確認させましたが、一致しませんでした。

Rails 側と Cocoa 側の両方でコンソールにハッシュされたデータの 16 進バージョンをログに記録したことを確認してください。それらは正確に一致します。

ココアの部分は次のとおりです。

#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];

..そしてレール:

Digest::SHA1.hexdigest(signed_data)

-hexadecimalString は、私がテストした NSData のカスタム拡張 (組み込まれていないようです) であることに注意してください。その方法は問題ではないようです。

では、SHA1 ハッシュが同じデータで一致しないのはなぜですか? 何か案は?

編集:例

文字列「Hello World!」の場合

ココア: f98ee9c814c2f3c66ccdca641298d12cd26741ec
レール: 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"
4

1 に答える 1

8

エラーが見つかりました、ばかげた小さなこと:

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

データの長さではなく、ダイジェストの長さを送信しました。どうしてこんな間違いを犯したのかわからない - そしてそれを何時間も見過ごしていた.

于 2009-03-27T16:18:03.237 に答える