Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Sijmen MulderОтветов: 1

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

rubyruby-on-railsobjective-ccocoasha1

Ответы

Ответ 1 · рейтинг 8 · Sijmen Mulder

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы