Хеши 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);
Я отправил длину дайджеста вместо длины данных. Не знаю, как я мог совершить такую ошибку, а затем пропустить ее часами.