web-dev-qa-db-fra.com

Vous utilisez du hachage MD5 sur une chaîne en cacao?

Duplicata possible:
algorithme MD5 dans l'objectif C

J'ai besoin de hacher une chaîne en utilisant la technique MD5 dans le cacao. Tous les frameworks utilisés doivent être accessibles sur l'iphone. veuillez fournir le code si possible.

42
zpesk

Eh bien, tout d'abord, MD5 n'est pas un cryptage. Donc, si vous recherchez le cryptage, vous cherchez au mauvais endroit.

Mais si vous voulez simplement hacher quelque chose en utilisant MD5 sur un iPhone, cela devrait vous donner les informations dont vous avez besoin:

#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 Calculer MD5 sur iPhone )

36
Chad Birch

Nous l'avons remarqué dans le code source de Facebook Connect. Semble assez solide, donnez-lui un coup de feu.

#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;
}
...
67
Jackie Treehorn

C'est ce que j'utilise. Les crédits vont à 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]
  ]; 
}

REMARQUE # 1: Je n'ai pas eu à créer de lien vers des bibliothèques

REMARQUE # 2: Je n'ai pas pu trouver -lcrypto dans la liste des frameworks externes sur l'iphone, et cela fonctionne sans -lcrypto

19
bentford

Il convient de mentionner que les méthodes OpenSSL sont obsolètes sur les versions plus récentes d'OS X, et le condensé MD5 est généralement en minuscules. Personnellement, je suis plus fan du style déroulé pour l'efficacité, et je pense que l'utilisation des catégories ObjC pour cela est mieux adaptée.

Pour MD5Digest.h: #include

@interface NSString (MD5Digest)
- (NSString*) md5Digest;
@end

@interface NSData (MD5Digest)
- (NSString*) md5Digest;
@end

Et 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
10
Tom M

J'ai ajouté ce qui suit à ma catégorie "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];
}

Deux choses:

  1. cela suppose que votre chaîne est UTF8. Je suis sûr qu'il existe un moyen de le rendre plus générique, mais je n'utilise presque jamais autre chose.

  2. vous devez lier -lcrypto à votre projet.

6
MarcWan

Après avoir passé trop de temps à essayer de comprendre cela, j'ai fait un article complet avec le code correct et comment l'utiliser. Vous pouvez trouver l'article ici sur mon blog. http://www.saobart.com/md5-has-in-objective-c/

6
Chris Beaven

MD5 n'est pas un cryptage, c'est un fonction de hachage cryptographique . Il s'agit d'une fonction unidirectionnelle dont la sortie est un nombre de 128 bits. Le fait qu'il soit cryptographique signifie qu'il s'agit d'un problème de calcul difficile qui, étant donné une sortie de hachage MD5, calcule une chaîne dont le MD5 est cette valeur. Ainsi, MD5 peut être utilisé pour les contrôles d'intégrité des données, mais pas pour le chiffrement.

3
Adam Rosenfield