2016-04-14 7 views
1

Hier ist ein grundlegendes CC_SHA256 Beispiel:CC_SHA256 erzeugt gleiche Leistung für die verschiedenen Eingang

-(void)hash:(NSData *)input 
{ 
    NSLog(@"Input is %@", [self NSDataToHex:input]); 

    NSMutableData *result = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; 

    CC_SHA256(CFBridgingRetain(input), input.length, result.mutableBytes); 

    NSLog(@"RESULT is %@", result); 
} 

Dieser Algorithmus korrekt zu funktionieren scheint. Ein kleiner Test:

NSString* str = @"abcde"; 
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; 

[self hash:data]; 

NSString* str2 = @"fghijk"; 
NSData* data2 = [str2 dataUsingEncoding:NSUTF8StringEncoding]; 

[self hash:data2]; 

gibt die folgende Ausgabe:

Input is 6162636465 
RESULT is <91681b5f 162cf494 238e5cac 0debbe92 c3ede9bf 4bcc7e79 845b774f b33e99f7> 
Input is 666768696A6B 
RESULT is <cccf7b6f 9acb96ae 84e9852b 1a753825 d6750555 57175c78 f86cf5fb bb3cfca7> 

Nun, wenn ich das zweite Argument (input.length) bis 3 ändern, ich folgende Ausgabe:

Input is 6162636465 
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570> 
Input is 666768696A6B 
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570> 

Diese Hashes sind gleich. Ich würde erwarten, dass der CC_SHA256-Algorithmus nur die ersten drei Zeichen meiner Eingabe hashen würde, aber anscheinend funktioniert das nicht so. Außerdem, wenn ich den Simulator neu starte, sind die erzeugten Hashes verschieden vom ersten Mal (aber immer noch gleich).

Warum passiert dieses Verhalten? Bitte geben Sie keine (offensichtliche) Workaround für dieses Problem. Ich möchte wirklich wissen, warum sich der Algorithmus so verhält.

+1

Ich glaube nicht, dass Sie in die richtigen Argumente für die Hash vorbei sind. Versuchen Sie, 'input.bytes' anstelle von' CFBridgingRetain (input) 'zu übergeben. Meine Vermutung ist, wenn Sie nur die Referenz von "Eingabe" übergeben Sie Hashing einige interne Daten im Zusammenhang mit 'NSData' und damit die ersten paar Bytes sind die gleichen und unterscheiden sich zwischen Lanches. SHA sollte deterministisch sein, so dass die Tatsache, dass es sich für dieselbe Eingabe ändert, bedeutet, dass Sie es falsch verwenden. – Jack

+0

Sie scheinen richtig zu sein. Ich fand auch, dass die zufällige Natur sehr seltsam war. Kannst du deine Antwort hinzufügen, damit ich sie als richtig markieren kann? – Dauntless

+0

Der unglückliche Teil ist jedoch, dass in der realen Anwendung die Eingabezeichenfolge viel länger ist (64 Zeichen) und die Eingabegröße auf 32 gesetzt wird. Beide (völlig verschiedene) Zeichenfolgen geben immer noch den gleichen Hashwert ... – Dauntless

Antwort

1

SHA (und jeder Hashing-Algorithmus) sollte deterministisch sein, und daher zeigt die Tatsache, dass es zwischen den Starts variiert, dass Sie es wahrscheinlich falsch verwenden.

Meine Vermutung ist, wenn Sie nur die Referenz der Eingabe übergeben Sie hashing einige interne Daten bezogen auf NSData und damit die ersten paar Bytes sind die gleichen, aber unterschiedlich zwischen lanches.

Überprüfen Sie eine dieser anderen Fragen (Sha256 in Objective-C for iPhone) für eine ordnungsgemäße Implementierung von SHA-256 auf iOS.

(von oben Antwort):

-(NSString*)sha256HashFor:(NSString*)input 
{ 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; 
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) 
    { 
     [ret appendFormat:@"%02x",result[i]]; 
    } 
    return ret; 
} 
+0

Danke für die Antworten. Es ist jedoch seltsam, dass für eine große Zeichenkette sogar die ersten 32 Bytes des Objekts identisch zu sein scheinen, da zwei verschiedene Zeichenketten der Länge 64 beide den gleichen Hash ergeben – Dauntless

Verwandte Themen