У меня есть приложение 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"
CC_SHA1. Я должен был использовать[data bytes]. Потребовалось унизительно много времени, чтобы понять это. - person Ben Scheirman   schedule 06.03.2012