objective-c - funciona - sha1 vs sha2
¿Cómo puedo calcular un hash SHA-2(idealmente SHA 256 o SHA 512) en iOS? (6)
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 )
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.
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.
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;
}
Reemplace CC_SHA1
con CC_SHA256
(o lo que sea que necesite), así como CC_SHA1_DIGEST_LENGTH
con CC_SHA256_DIGEST_LENGTH
.
Necesitas #import <CommonCrypto/CommonDigest.h>
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
}
Limpié un poco https://.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
+ (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];
}