2011-06-03 15 views
54

La API de servicios de seguridad no parece permitirme calcular un hash directamente. Hay muchas versiones de dominio público y con licencia gratuita disponibles, pero prefiero usar una implementación de biblioteca del sistema si es posible.¿Cómo puedo calcular un hash SHA-2 (idealmente SHA 256 o SHA 512) en iOS?

Se puede acceder a los datos a través de NSData o punteros simples.

La fuerza criptográfica del hash es importante para mí. SHA-256 es el tamaño de hash mínimo aceptable.

Respuesta

78

Esto es lo que estoy usando para SHA1:

+ (NSData *)sha1:(NSData *)data { 
    unsigned char hash[CC_SHA1_DIGEST_LENGTH]; 
    if (CC_SHA1([data bytes], [data length], hash)) { 
     NSData *sha1 = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];   
     return sha1; 
    } 
return nil; 
} 

Reemplazar CC_SHA1 con CC_SHA256 (o lo que sea necesario), así como con CC_SHA1_DIGEST_LENGTHCC_SHA256_DIGEST_LENGTH.

Necesitas #import <CommonCrypto/CommonDigest.h>

+2

La importación me salvó, gracias! – 1789040

+0

Esto no funcionó ... la conversión de los datos devueltos a un NSString devuelto nil para mí. La publicación debajo de "hashed_string" funcionó si pasé los datos. – TheJeff

+0

@TheJeff: la pregunta no dice nada acerca de devolver el valor de SHA como una cadena hexadecimal. La conversión de 'NSData' a' NSString' puede ser una pregunta separada por sí misma. –

31

Aquí hay una muy similar basada en NSString

+ (NSString *)hashed_string:(NSString *)input 
{ 
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:input.length]; 
    uint8_t digest[CC_SHA256_DIGEST_LENGTH]; 

    // This is an iOS5-specific method. 
    // It takes in the data, how much data, and then output format, which in this case is an int array. 
    CC_SHA256(data.bytes, data.length, digest); 

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; 

    // Parse through the CC_SHA256 results (stored inside of digest[]). 
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { 
     [output appendFormat:@"%02x", digest[i]]; 
    } 

    return output; 
} 

(Los créditos van a http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1)

+4

para iOS 7+ para lanzar la data.length: CC_SHA256 (data.bytes, (int) data.length, digest); – RyanG

+0

los datos deben ser '[NSData dataWithBytes: cstr length: strlen (cstr)];' Sería mejor usar '[input dataUsingEncoding: NSUTF8StringEncoding];' – mikeytdan

3

Esto es lo que funcionó para mí

func sha256(securityString : String) -> String { 
    let data = securityString.dataUsingEncoding(NSUTF8StringEncoding)! 
    var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0) 
    CC_SHA256(data.bytes, CC_LONG(data.length), &hash) 
    let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH)) 
    for byte in hash { 
     output.appendFormat("%02x", byte) 
    } 
    return output as String 
} 
0
+ (NSData *)sha256DataFromData:(NSData *)data { 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256([data bytes], (int)[data length], result); 
    return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH]; 
}