2010-09-30 3 views
21

Je développe la fonction de connexion pour mon application iPhone, donc je veux hacher le mot de passe en utilisant l'algorithme de hachage SHA512 puis obtenir le résultat comme NSString (le résultat devrait être le même avec SHA512 en C#). Après avoir passé beaucoup de temps sur internet, je ne trouve pas encore la solution pour le moment! :(hachage une chaîne de mot de passe en utilisant SHA512 comme C#

Est-ce qu'il ya quelqu'un a le code de solution et de l'échantillon, s'il vous plaît aidez-moi! Merci beaucoup!

[Mise à jour] Dans mon code C#, le mot de passe est enregistré à l'aide SecureString, alors peut-être il est la cause make . différent tableau d'octets entre objective-C et C#

Répondre

30

Cette fonction de hachage d'une chaîne à l'aide SHA512 la chaîne résultante est une représentation hexadécimale du hachage:

+ (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]; 
} 

ne pas oublier d'inclure le corre en-tête de ct:

#include <CommonCrypto/CommonDigest.h> 
+0

Oh, merci beaucoup, je vais essayer dès maintenant! –

+0

Cher Philippe, ça marche bien, merci! –

+0

Cher Philippe, J'ai un problème en comparant les mots de passe hashés entre C# et objectif-c. Dans mon code C#, j'ai utilisé SecureString pour stocker le mot de passe, donc je dois utiliser Marshal Copy pour obtenir le byte array et j'ai vu qu'il y a 0 octets ajoutés après le caractère de chaque mot de passe, peut-être parce que le hashed est différent. Je ne sais pas comment le résoudre, pourriez-vous m'aider encore s'il vous plaît? Merci! –

18

J'utilise celui-ci.

Il correspond PHP SHA512 sortie de l'algorithme:

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


Code 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 Cela fonctionne mieux pour moi. La sortie de la réponse est indésirable pour comparaison php: <9870d986 f510384d 932cdff5 13fb1886 0eee6d6f 1e90e794 bd25b980 bd0a48d1 d5fdd937 f454408f e93f5a61 e8724993 0e153424 41a24f9f 3059a9ea 3e029f2a> Où que cette réponse sorties quelque chose comme: 9870d986f510384d932cdff513fb18860eee6d6f1e90e794bd25b980bd0a48d1d5fdd937f454408fe93f5a61e87249930e15342441a24f9f3059a9ea3e029f2a – capikaw

+2

pourquoi vous devez multiplier pour 2 en sortie: CC_SHA512_DIGEST_LENGTH * 2? –

+1

@SisterRay Comme son nom l'indique, il s'agit de 512 bits, soit 64 octets. Mais c'est le hachage, peut-être que vous vous interrogez sur une représentation spécifique de ce hachage dans la chaîne, comme cela est couramment utilisé, alors cela dépend de la représentation donnée. Si vous écrivez le hachage en hexa, alors ce sera 128 caractères. Si vous écrivez le hachage en base64, ce sera 86 octets (ou 88 avec remplissage). – Wingzero

Questions connexes