¿Cómo puedo calcular un hash SHA-2 (idealmente SHA 256 o SHA 512) en iOS?

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.

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.

Esto es lo que estoy usando para SHA1:

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

Reemplace CC_SHA1 con CC_SHA256 (o lo que sea que necesite), así como CC_SHA1_DIGEST_LENGTH con CC_SHA256_DIGEST_LENGTH .

Aquí hay uno bastante similar basado 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 )

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 } 

Debajo del enlace que usé para crear el valor hash del documento y su valor hash muy simple y fácil de calcular especialmente para archivos de gran tamaño.

Enlace: http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and-mac- os-x / comment-page-1 / # comment-18533

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

Limpié un poco https://stackoverflow.com/a/13199111/1254812 y lo estructuré como una extensión NSString

 @interface NSString (SHA2HEX) /* Get the SHA2 (256 bit) digest as a hex string. */ @property (nonatomic, readonly) NSString* sha2hex; @end @implementation NSString (SHA2HEX) - (NSString*)sha2hex { NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding]; if (data.length > UINT32_MAX) return nil; uint8_t digest[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(data.bytes, (CC_LONG)data.length, digest); const int hexlen = CC_SHA256_DIGEST_LENGTH * 2; NSMutableString *hexstr = [NSMutableString stringWithCapacity:hexlen]; for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { [hexstr appendFormat:@"%02x", digest[i]]; } return hexstr; } @end