SHA1 nie pasuje do moich aplikacji Rails i Cocoa

Mam aplikację Cocoa, która wysyła pewne dane wraz ze skrótem SHA1 tych danych do aplikacji Rails, która sprawdza, czy dane i skrót są zgodne, ale tak nie jest.

Aby mieć pewność, zarejestrowałem szesnastkowe wersje danych, które są haszowane w konsoli zarówno po stronie Railsów, jak i Cocoa, i są one dokładnie zgodne.

Oto część dotycząca kakao:

#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];

..i szyny:

Digest::SHA1.hexdigest(signed_data)

Zauważ, że -hexadecimalString jest niestandardowym rozszerzeniem NSData (wydaje się nie być wbudowane), które przetestowałem. Ta metoda nie wydaje się stanowić problemu.

Dlaczego więc moje skróty SHA1 nie pasują do tych samych danych? Jakieś pomysły?

Edycja: przykład

Dla ciągu „Hello World!”

Cocoa: f98ee9c814c2f3c66ccdca641298d12cd26741ec
Rails: 2ef7bde608ce5404e97d5f042f95f89f1c232871

Kakao:

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

Rubin:

>> Digest::SHA1.hexdigest("Hello World!")
=> "2ef7bde608ce5404e97d5f042f95f89f1c232871"

person Sijmen Mulder    schedule 27.03.2009    source źródło
comment
czy możesz opublikować przykładowe dane i podsumowania, abyśmy mogli zobaczyć, które z nich są nieprawidłowe?   -  person cobbal    schedule 27.03.2009
comment

Node.js z YUI na serwerze. Obejrzyj ten film: http://www.yuiblog.com/blog/2010/09/29/video-glass-node/

Facet w tym filmie Dav Glass pokazuje przykład użycia węzła do pobrania strony z serwisu Digg. Następnie podłączył YUI do chwyconego DOM i może nim całkowicie manipulować.

  -  person glenc    schedule 28.01.2011
comment
Miałem podobny błąd, jednak w moim przypadku użyłem samego wskaźnika danych jako pierwszego argumentu CC_SHA1. Powinienem był użyć [data bytes]. Rozpracowanie tego zajęło żenująco dużo czasu.   -  person Ben Scheirman    schedule 06.03.2012


Odpowiedzi (1)


Znalazłem błąd, głupia drobnostka:

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

Wysłałem długość podsumowania zamiast długości danych. Nie wiem, jak mogłem popełnić taki błąd, a potem przeoczać go godzinami.

person Sijmen Mulder    schedule 27.03.2009