2010-09-30 21 views
21

Estoy desarrollando la función de inicio de sesión para mi aplicación de iPhone, así que quiero cifrar la contraseña usando el algoritmo de hash SHA512 y obtener el resultado como NSString (el resultado debería ser el mismo con SHA512 en C#) Después de pasar mucho tiempo en internet, todavía no descubro la solución. :(hash una cadena de contraseña usando SHA512 como C#

¿Hay alguien tiene el código de la solución y de la muestra, por favor, ayúdame! Muchas gracias!

[Actualización] En mi código C#, la contraseña se almacena utilizando SecureString, por lo que tal vez es la causa maquillaje . diferente matriz de bytes entre Objective-C y C#

Respuesta

30

Esta función hash de una cadena utilizando SHA512 la cadena resultante es una representación hexadecimal 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]; 
} 

no se olvide de incluir el corre cabecera del ct:

#include <CommonCrypto/CommonDigest.h> 
+0

Oh, muchas gracias, voy a probarlo ahora mismo! –

+0

Estimado Philippe, está funcionando bien, ¡gracias! –

+0

Estimado Philippe, Tengo un problema que cuando se comparan las contraseñas hash son diferentes entre C# y Objective-c. En mi código C#, utilicé SecureString para almacenar la contraseña, así que tengo que usar Marshal Copy para obtener la matriz de bytes y vi que hay 0bytes añadidos después de cada char de la contraseña, tal vez porque el pase hash es diferente. No sé cómo resolverlo, ¿podrían ayudarme otra vez? ¡Gracias! –

18

Estoy usando este.

Coincide con PHP SHA512 salida del algoritmo:

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


código 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 Esto funciona mejor para mí. La producción de la respuesta no es deseable para la comparación php: <9870d986 f510384d 932cdff5 13fb1886 0eee6d6f 1e90e794 bd25b980 bd0a48d1 d5fdd937 f454408f e93f5a61 e8724993 0e153424 41a24f9f 3059a9ea 3e029f2a> Donde ya que esto salidas respuesta algo como: 9870d986f510384d932cdff513fb18860eee6d6f1e90e794bd25b980bd0a48d1d5fdd937f454408fe93f5a61e87249930e15342441a24f9f3059a9ea3e029f2a – capikaw

+2

¿por qué hay que multiplicar por 2 en la salida: CC_SHA512_DIGEST_LENGTH * 2? –

+1

@SisterRay Como su nombre lo indica, son 512 bits, es decir 64 bytes. Pero ese es el hash, tal vez te estás preguntando acerca de una representación específica de ese hash en la cadena, como se usa comúnmente, entonces depende de la representación dada. Si escribe el hash en hexa, tendrá 128 caracteres. Si escribe el hash en base64, tendrá 86 bytes (o 88 con relleno). – Wingzero

Cuestiones relacionadas