2009-03-16 9 views
42

Duplicar posible:
MD5 algorithm in Objective C¿Usar el hash MD5 en una cadena de cacao?

necesito para discutir una cadena utilizando la técnica MD5 en el cacao. Cualquier marco que se utilice debe poder accederse en el iPhone. por favor proporcione el código si es posible.

+1

si es posible, no utilice MD5 sino un sha-hash. MD5 se considera roto. –

+6

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). –

+2

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 –

Respuesta

36

Bueno, antes que nada, MD5 no es cifrado. Entonces, si buscas encriptación, estás buscando en el lugar equivocado.

Pero si lo que desea para discutir algo con MD5 en un iPhone, esto debe darle la información que necesita:

#import <CommonCrypto/CommonDigest.h> 

NSString *md5(NSString *str) { 
    const char *cStr = [str UTF8String]; 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 
    CC_MD5(cStr, strlen(cStr), result); 
    return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
     result[0], result[1], 
     result[2], result[3], 
     result[4], result[5], 
     result[6], result[7], 
     result[8], result[9], 
     result[10], result[11], 
     result[12], result[13], 
     result[14], result[15] 
    ]; 
} 

//… 

NSString *digest = md5(@"test"); 
NSLog(@"MD5 TEST %@", digest); 

(De Calculate MD5 on iPhone)

+43

Correcto, pero -1. Yo uso stackoverflow para evitar otros sitios del foro. Considere publicar una respuesta real en lugar de un enlace. – bentford

3

MD5 no está cifrado, se trata de una cryptographic hash function. Es una función unidireccional cuyo resultado es un número de 128 bits. El hecho de que sea criptográfico significa que es un problema computacionalmente difícil que, dada una salida de hash MD5, calcule una cadena cuyo MD5 es ese valor. Por lo tanto, MD5 se puede usar para verificar la integridad de los datos, pero no para el cifrado.

+1

Cabe señalar que MD5 se ha visto comprometido, por lo que ya no es factible atacarlo. Eso puede no importar dependiendo de para qué lo use, pero vale la pena tenerlo en cuenta. http://en.wikipedia.org/wiki/MD5#Vulnerability –

+8

Debe tenerse en cuenta que el póster original no pidió cifrado ... –

+1

Lo hicieron al principio. – Joe

6

que añade lo siguiente a mi categoría "NSString + MyGoonk":

#include <openssl/md5.h> 

- (NSString *)md5 
{ 
    NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding]; 
    unsigned char *digest = MD5([data bytes], [data length], NULL); 
    return [NSString stringWithUTF8String: (char *)digest]; 
} 

dos cosas:

  1. esto supone que la cadena es UTF8. Estoy seguro de que hay una manera de hacerlo más genérico, pero casi nunca uso otra cosa.

  2. tiene que vincular -lcrypto a su proyecto.

+0

Esto está en desuso al iniciar OS X 10.7. – Pripyat

19

Esto es lo que uso. Los créditos van al Alistair McMillan.

#import <CommonCrypto/CommonDigest.h> 


+ (NSString *) md5:(NSString *)str { 
const char *cStr = [str UTF8String]; 
unsigned char result[16]; 
CC_MD5(cStr, strlen(cStr), result); 
return [NSString stringWithFormat: 
    @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
    result[0], result[1], result[2], result[3], 
    result[4], result[5], result[6], result[7], 
    result[8], result[9], result[10], result[11], 
    result[12], result[13], result[14], result[15] 
    ]; 
} 

NOTA # 1: Yo no tengo que enlazar a ninguna biblioteca

NOTA # 2: No pude encontrar -lcrypto en la lista marco externo en el iPhone, y esto funciona sin -lcrypto

6

Después de pasar demasiado tiempo tratando de resolver esto hice una publicación completa con el código correcto y cómo usarlo. Puedes encontrar la publicación aquí en mi blog.

+0

Gracias. Muy útil. – znq

+0

Gracias hombre. Creo que esta es la respuesta correcta. – itsaboutcode

+0

Vale la pena señalar que esta solución es idéntica al código que publiqué anteriormente. – bentford

67

Noté esto en el código fuente de Facebook Connect. Se ve bastante sólido, pruébalo.

#import <CommonCrypto/CommonDigest.h> 

... 

+ (NSString*)md5HexDigest:(NSString*)input { 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 
    CC_MD5(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2]; 
    for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) { 
     [ret appendFormat:@"%02x",result[i]]; 
    } 
    return ret; 
} 
... 
+9

+1 esto es básicamente equivalente a mi fragmento anterior, pero se ve un poco más limpio. – bentford

+3

@bentford: Las soluciones más limpias son mucho mejores. – FreeAsInBeer

+1

Para silenciar la advertencia en XCode cast 'strlen (str)' a '(CC_LONG) strlen (str)' – Jasper

10

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 
+0

Para corregir las advertencias del compilador y el posible problema con datos> 4GB Utilicé: return md5Digest ([self bytes], (CC_LONG) MIN (UINT32_MAX, [self length])); – dbainbridge