2009-03-27 14 views
14

Tengo una aplicación Cocoa enviar algunos datos junto con un hash SHA1 de los datos a una aplicación Rails que verifica que los datos y el hash coincidan, pero no es así.hashes SHA1 no coinciden entre mis aplicaciones Rails y Cocoa

Para estar seguro de haber registrado las versiones hexadecimales de los datos que se hased a la consola en los lados Rails y Cocoa, y coinciden exactamente.

Aquí está 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]; 

..y Rieles:

Digest::SHA1.hexdigest(signed_data) 

Tenga en cuenta que -hexadecimalString es una extensión personalizada a NSData (no parecía ser incorporada), lo cual Lo he probado Ese método no parece ser el problema.

Entonces, ¿por qué mis hashes SHA1 no coinciden con los mismos datos? ¿Algunas ideas?

Editar: ejemplo

Para la cadena "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" 
+0

¿podría publicar un dato de muestra y digerir para que podamos ver cuál es incorrecto? – cobbal

+2

FWIW - Acabo de descubrir este mismo problema en mi aplicación de iPhone. CC_SHA1 no devolvía los mismos valores hash como lo hace Python hashlib.sha1. No tuve el mismo problema de paso de longitud incorrecto que sjmulder, lo que fue demostrado por el hecho de que simplemente cambiar para usar la implementación de OpenSSL SHA1() en lugar de CC_SHA1() realmente lo solucionó. No cambié los argumentos ni nada, solo a qué función llamé para calcular el hash. Es muy extraño y preocupante que CC_SHA1() parezca tener errores. – glenc

+0

Tuve un error similar, sin embargo, en mi caso, estaba usando el puntero de datos para el primer argumento de 'CC_SHA1'. Debería haber estado usando '[data bytes]'. Tomó un tiempo vergonzosamente largo para resolver esto. –

Respuesta

8

encontrado el error, estúpida pequeña cosa:

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

I envió la longitud de la digestión en lugar de la longitud de los datos. No sé cómo podría haber cometido ese error, y luego pasarlo por alto durante horas.

Cuestiones relacionadas