2009-03-27 9 views
14

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" 
+0

potresti pubblicare un dato di esempio e digerire in modo che possiamo vedere quale è errato? – cobbal

+2

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

+0

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. –

risposta

8

Trovato l'errore, stupida piccola cosa:

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

ho mandato la lunghezza del digest al posto del lunghezza dei dati. Non so come avrei potuto commettere un simile errore e poi trascurarlo per ore.