Vale la pena mencionar que los métodos de OpenSSL están en desuso en las versiones más recientes de OS X, y el resumen MD5 es el caso convencionalmente inferior. Personalmente soy más partidario del estilo desenrollado para la eficiencia, y creo que usar categorías ObjC para esto es una mejor opción.
Para MD5Digest.h: # include
@interface NSString (MD5Digest)
- (NSString*) md5Digest;
@end
@interface NSData (MD5Digest)
- (NSString*) md5Digest;
@end
Y MD5Digest.m:
#include <CommonCrypto/CommonDigest.h>
#include "MD5Digest.h"
static NSString* md5Digest(const void *data, CC_LONG length)
{
unsigned char digest[CC_MD5_DIGEST_LENGTH];
unsigned char* d = CC_MD5(data, length, digest);
return [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15],
nil];
}
@implementation NSString (MD5Digest)
- (NSString*) md5Digest
{
return md5Digest([self UTF8String], [self lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
}
@end
@implementation NSData (MD5Digest)
- (NSString*) md5Digest
{
return md5Digest([self bytes], [self length]);
}
@end
si es posible, no utilice MD5 sino un sha-hash. MD5 se considera roto. –
MD5 no está "roto", hay una vulnerabilidad particular que le permite crear una colisión cuando ya tiene bastante información acerca de los datos que se procesan. Todavía es una opción perfectamente válida para aplicaciones como la verificación de contraseñas (aunque usar una sal siempre es una buena idea). –
El uso de MD5 con fines criptográficos no es aconsejable. Así es cómo replicar un hash MD5: http://www.mscs.dal.ca/~selinger/md5collision/ Estas herramientas tardan unas horas en una caja de PC. Así es como se forja un certificado digital MD5: http://www.schneier.com/crypto-gram-0901.html Aquí hay más detalles sobre los ataques: http://www.schneier.com/blog/ archives/2005/06/more_md5_collis.html –