42 votes

Utiliser le hachage MD5 sur une chaîne de caractères dans cocoa ?

Duplicata possible :
Algorithme MD5 en Objective C

Je dois hacher une chaîne de caractères en utilisant la technique MD5 en cacao. Tous les frameworks utilisés doivent être accessibles sur l'iphone. Veuillez fournir le code si possible.

67voto

Jackie Treehorn Points 726

J'ai remarqué cela dans le code source de Facebook Connect. Cela semble assez solide, essayez-le.

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

36voto

Chad Birch Points 39087

Eh bien, tout d'abord, MD5 n'est pas un cryptage. Donc si vous cherchez du cryptage, vous ne cherchez pas au bon 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 le MD5 sur l'iPhone )

19voto

bentford Points 9981

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

NOTE #1 : Je n'ai pas eu à faire de liens vers des bibliothèques.

NOTE #2 : Je n'ai pas trouvé -lcrypto dans la liste des frameworks externes sur l'iphone, et cela fonctionne sans -lcrypto.

10voto

Tom M Points 121

Il convient de mentionner que les méthodes OpenSSL sont dépréciées sur les versions plus récentes d'OS X, et que le condensé MD5 est conventionnellement en minuscules. Personnellement, je suis plutôt partisan du style déroulé pour des raisons d'efficacité, et je pense que l'utilisation des catégories ObjC pour cela est plus 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

6voto

MarcWan Points 849

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 y a un moyen de le rendre plus générique, mais je n'utilise presque jamais autre chose.

  2. vous devez lier -lcrypto dans votre projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X