Хеши SHA1 не совпадают между моими Rails и Cocoa приложениями

У меня есть приложение 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

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"

Ответы

Ответ 1

Нашла ошибку, тупое:

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

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