2011-02-14 14 views
12

Duplicar posibles:
Sha256 in Objective-C for iPhoneGenerar SHA256 cadena en C Objetivo

Saludos,

estoy teniendo terribles problemas para generar una cadena SHA256 en Objective C (probablemente porque soy tan nuevo en el lenguaje).

En jQuery, todo lo que tengo que hacer es esto:

var sha256String=$.sha256("Hello"); 

que produce el hash como se esperaba.

Pero en Objective-C, lo he intentado lo siguiente en vano:

NSString *pword=[[NSString alloc] 
initWithString:login_pword.text]; 
unsigned char result[64]; 
CC_SHA256([pword UTF8String], [pword lengthOfBytesUsingEncoding:NSASCIIStringEncoding],result); 
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:result delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
[msg show]; 
[msg release]; 

¿Hay alguna función que puedo llamar como:

NSString *sha256String=[self getSHA256:pword]; 

Esto es lo que yo' Estoy tratando de crear y me resulta muy difícil.

Espero que alguien pueda ayudar.

Muchas gracias de antemano,

+3

Espero que no esperes ninguna similitud de comportamiento entre Javascript y Objective-C. –

+0

He visto ese hilo ya gracias. Estoy tratando de devolver la cadena sha256. – Eamorr

+2

La pregunta vinculada no es un duplicado exacto. Votado para reabrir. –

Respuesta

3

Usted está pasando result en el método UIAlertViewinit. result es un char[], y UIAlertView espera un NSString*. Necesita convertir su char[] en un NSString *.

Prueba esto:

NSString *resultString = [NSString stringWithCString:result encoding:NSASCIIStringEncoding]; 
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

Véase también this artículo sobre hash en el iPhone.

+0

Oye, lo hice, pero tengo el truco del resultado. Se parece a UTF8, cuando de hecho lo quiero codificado en base64 ... – Eamorr

+0

Bueno, no estás codificando Base64 los datos de resultados en ningún lugar del código que publicaste. ¿Has intentado hacer eso primero? Y de nuevo, lea el artículo al que publiqué el enlace. Es para hash MD5 pero menciona ajustes que tienes que hacer para SHA256. –

1

Usted tendrá que utilizar las funciones de OpenSSL C. Ver por ejemplo this question sobre cómo hacer eso. Como cadena de entrada, usaría [myString UTFString] con longitud [myString lengthOfBytesUsingEncoding:NSUTF8StringEncoding].

53

Después de mucho jugando hoy, por fin se le ocurrió una función para obtener la SHA256:

-(NSString*) sha256:(NSString *)clear{ 
    const char *s=[clear cStringUsingEncoding:NSASCIIStringEncoding]; 
    NSData *keyData=[NSData dataWithBytes:s length:strlen(s)]; 

    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0}; 
    CC_SHA256(keyData.bytes, keyData.length, digest); 
    NSData *out=[NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; 
    NSString *hash=[out description]; 
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""]; 
    return hash; 
} 

Esto da el mismo resultado que en PHP. Se puede convertir fácilmente en SHA1 - simplemente cambie 'SHA256' a 'SHA1'.

Espero que ayude a alguien.

+1

Ayudó a alguien. ¡Muchas gracias! ':)' –

+0

Ayudó a alguien más también, ¡gracias! – barfoon

+0

Yo también me ayudé - gracias Eamorr! –