2010-09-30 5 views
21

Ich entwickle Anmeldefunktion für meine iPhone-Anwendung, so möchte ich das Passwort mit dem SHA512 Hash-Algorithmus Hash dann erhalten Sie das Ergebnis als NSString (das Ergebnis sollte gleich sein mit SHA512 in C#). Nachdem ich viel Zeit im Internet verbracht habe, finde ich die Lösung noch nicht! :(Hash eine Passwort-Zeichenfolge mit SHA512 wie C#

Gibt es jemand die Lösung und Beispielcode hat, bitte hilf mir! Vielen Dank!

[Update] In meinem C# -Code, wird das Kennwort Secure gespeichert ist, so vielleicht ist es Sache machen . unterschiedlicher Byte-Array zwischen Objective-C und C#

Antwort

30

Diese Funktion wird eine Zeichenfolge mit SHA512 Hash der resultierende String ist eine hexadezimale Darstellung des hash:

+ (NSString *) createSHA512:(NSString *)source { 

    const char *s = [source cStringUsingEncoding:NSASCIIStringEncoding]; 

    NSData *keyData = [NSData dataWithBytes:s length:strlen(s)]; 

    uint8_t digest[CC_SHA512_DIGEST_LENGTH] = {0}; 

    CC_SHA512(keyData.bytes, keyData.length, digest); 

    NSData *out = [NSData dataWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 

    return [out description]; 
} 

nicht vergessen die Corre einschließen ct header:

#include <CommonCrypto/CommonDigest.h> 
+0

Oh, danke Ihnen so sehr, ich will es jetzt versuchen! –

+0

Lieber Philippe, es funktioniert gut, danke! –

+0

Lieber Philippe, ich habe ein Problem, dass beim Vergleich Hash-Passwörter zwischen C# und Ziel-C unterscheiden. In meinem C# -Code habe ich SecureString verwendet, um das Passwort zu speichern, also muss ich Marshal Copy verwenden, um Byte-Array zu erhalten, und ich habe gesehen, dass nach jedem Passwort 13 Bytes angehängt sind, vielleicht liegt das daran, dass der Hash-Pass unterschiedlich ist. Ich weiß nicht, wie ich es lösen soll, könntest du mir bitte wieder helfen? Vielen Dank! –

18

Ich benutze dieses.

Es passt PHP SHA512 Algorithmus Ausgabe:

<?php `hash('sha512', 'The quick brown fox jumped over the lazy dog.');` ?> 


Objective-C-Code:

+(NSString *)createSHA512:(NSString *)string 
{ 
    const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:string.length]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2]; 

    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) 
     [output appendFormat:@"%02x", digest[i]]; 
    return output; 
} 
+1

+1 Das funktioniert besser für mich. Der Ausgang der Antwort ist nicht wünschenswert für PHP Vergleich: <9870d986 f510384d 932cdff5 13fb1886 0eee6d6f 1e90e794 bd25b980 bd0a48d1 d5fdd937 f454408f e93f5a61 e8724993 0e153424 41a24f9f 3059a9ea 3e029f2a> Wo, wie diese Antwort gibt so etwas wie: 9870d986f510384d932cdff513fb18860eee6d6f1e90e794bd25b980bd0a48d1d5fdd937f454408fe93f5a61e87249930e15342441a24f9f3059a9ea3e029f2a – capikaw

+2

warum tun Sie für 2 in der Ausgabe multiplizieren: CC_SHA512_DIGEST_LENGTH * 2? –

+1

@SisterRay Wie der Name schon sagt, sind es 512 Bit, also 64 Byte. Aber das ist der Hash, vielleicht fragen Sie sich über eine bestimmte Darstellung dieses Hash in String, wie es häufig verwendet wird, dann hängt es von der gegebenen Darstellung ab. Wenn Sie den Hash in Hexa schreiben, dann wird es 128 Zeichen sein. Wenn Sie den Hash in base64 schreiben, dann wird es 86 Bytes (oder 88 mit Padding) sein. – Wingzero