Хэши SHA1 не совпадают между моими приложениями Rails и Cocoa - PullRequest
14 голосов
/ 27 марта 2009

У меня есть приложение Какао, которое отправляет некоторые данные вместе с хешем 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];

.. и 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"

1 Ответ

8 голосов
/ 27 марта 2009

Нашли ошибку, глупая мелочь:

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

Я отправил длину дайджеста вместо длины данных. Не знаю, как я мог совершить такую ​​ошибку, а потом пропустить ее часами.

...