2010-09-30 13 views
21

Sto sviluppando la funzione di accesso per la mia applicazione iPhone, quindi voglio hash la password utilizzando l'algoritmo di hash SHA512 quindi ottenere il risultato come NSString (il risultato dovrebbe essere lo stesso con SHA512 in C#). Dopo aver trascorso un sacco di tempo in internet, non ho ancora trovato la soluzione! :(hash una stringa di password utilizzando SHA512 come C#

C'è qualcuno ha il codice della soluzione e del campione, please help me! Grazie mille!

[Update] Nel mio codice C#, la password viene memorizzata utilizzando SecureString, quindi forse è causa make . diversa matrice di byte tra Objective-C e C#

risposta

30

Questa funzione hash di una stringa utilizzando SHA512 la stringa risultante è una rappresentazione esadecimale del 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]; 
} 

non dimenticare di includere il corre ct header:

#include <CommonCrypto/CommonDigest.h> 
+0

Oh, grazie mille, cercherò subito! –

+0

Caro Philippe, sta funzionando bene, grazie! –

+0

Gentile Philippe, ho un problema che quando si confrontano le password con hash sono diverse tra C# e l'obiettivo-c. Nel mio codice C#, ho usato SecureString per memorizzare la password, quindi devo usare Marshal Copy per ottenere array di byte e ho visto che ci sono 0 byte aggiunti dopo il carattere di ogni password, forse perché il passaggio hash è diverso. Non so come risolverlo, potresti per favore aiutarmi ancora? Grazie! –

18

Sto usando questo.

Si abbina PHP SHA512 uscita algoritmo:

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


codice Objective-C:

+(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 Funziona meglio per me. Uscita La risposta è indesiderabile per il confronto php: <9870d986 f510384d 932cdff5 13fb1886 0eee6d6f 1e90e794 bd25b980 bd0a48d1 d5fdd937 f454408f e93f5a61 e8724993 0e153424 41a24f9f 3059a9ea 3e029f2a> Dove come questo uscite risposta qualcosa come: 9870d986f510384d932cdff513fb18860eee6d6f1e90e794bd25b980bd0a48d1d5fdd937f454408fe93f5a61e87249930e15342441a24f9f3059a9ea3e029f2a – capikaw

+2

perché devi moltiplicare per 2 in uscita: CC_SHA512_DIGEST_LENGTH * 2? –

+1

@SisterRay Come suggerisce il nome, è 512 bit, ovvero 64 byte. Ma questo è l'hash, forse ti stai chiedendo una specifica rappresentazione di quell'hash nella stringa, come è comunemente usato, quindi dipende dalla rappresentazione data. Se si scrive l'hash in hexa, saranno 128 caratteri. Se si scrive l'hash in base64, allora sarà 86 byte (o 88 con padding). – Wingzero