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