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

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

..и рельсы:

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

Рубин:

>> Digest::SHA1.hexdigest("Hello World!")
=> "2ef7bde608ce5404e97d5f042f95f89f1c232871"

person Sijmen Mulder    schedule 27.03.2009    source источник
comment
Не могли бы вы опубликовать образец данных и дайджестов, чтобы мы могли увидеть, что неверно?   -  person cobbal    schedule 27.03.2009
comment
FWIW - я только что обнаружил эту же проблему в своем приложении для iPhone. CC_SHA1 не возвращал те же хэши, что и Python hashlib.sha1. У меня не было такой же проблемы с передачей неправильной длины, как у sjmulder, что было доказано тем фактом, что простой переход на использование реализации OpenSSL SHA1() вместо CC_SHA1() фактически устранил ее. Не менял аргументы или что-то еще, только какую функцию я вызвал для вычисления хеша. Очень странно и тревожно, что CC_SHA1() глючит.   -  person glenc    schedule 28.01.2011
comment
У меня была похожая ошибка, однако в моем случае я использовал сам указатель данных в качестве первого аргумента для CC_SHA1. Я должен был использовать [data bytes]. Потребовалось унизительно много времени, чтобы понять это.   -  person Ben Scheirman    schedule 06.03.2012


Ответы (1)


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

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

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

person Sijmen Mulder    schedule 27.03.2009