Ho un'app Cocoa che invia alcuni dati insieme a un hash SHA1 di quei dati a un'app Rails che verifica che i dati e l'hash corrispondano, ma non lo fanno.SHA1 hash non corrispondenti tra le mie app Rails e Cocoa
Per essere sicuro di aver registrato le versioni esadecimali dei dati che sono state sottoposte a hashing alla console su entrambi i lati Rails e Cocoa, e corrispondono esattamente.
ecco la parte cacao:
#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];
..e Rails:
Digest::SHA1.hexdigest(signed_data)
Nota che -hexadecimalString è un'estensione personalizzata per NSData (non sembrano essere costruito in), che Ho provato Questo metodo non sembra essere il problema.
Quindi, perché i miei hash SHA1 non corrispondono agli stessi dati? Qualche idea?
Edit: esempio
Per la stringa "Ciao Mondo!"
Cocoa: f98ee9c814c2f3c66ccdca641298d12cd26741ec Rails: 2ef7bde608ce5404e97d5f042f95f89f1c232871
cacao:
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
Rubino:
>> Digest::SHA1.hexdigest("Hello World!")
=> "2ef7bde608ce5404e97d5f042f95f89f1c232871"
potresti pubblicare un dato di esempio e digerire in modo che possiamo vedere quale è errato? – cobbal
FWIW - Ho appena scoperto lo stesso problema nella mia app per iPhone. CC_SHA1 non restituiva gli stessi hash delle cose di hashlib.sha1 di Python. Non ho avuto lo stesso problema con la lunghezza errata di sjmulder, il che è stato dimostrato dal fatto che semplicemente cambiando per utilizzare l'implementazione di OpenSSL SHA1() invece di CC_SHA1() in realtà l'ha risolto. Non ha cambiato argomenti o altro, solo quale funzione ho chiamato per calcolare l'hash. Molto strano e preoccupante che CC_SHA1() sembra essere bacato. – glenc
Avevo un bug simile, tuttavia nel mio caso stavo usando il puntatore dati stesso per il primo argomento a 'CC_SHA1'. Avrei dovuto usare '[data bytes]'. Ci è voluto un tempo imbarazzante per capirlo. –