Question

Comment calculer le MD5 en Objective-C?

Était-ce utile?

La solution

md5 est disponible sur l'iPhone et peut être ajouté comme une addition pour c.-à-NSString et NSData comme ci-dessous.

MyAdditions.h

@interface NSString (MyAdditions)
- (NSString *)md5;
@end

@interface NSData (MyAdditions)
- (NSString*)md5;
@end

MyAdditions.m

#import "MyAdditions.h"
#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access

@implementation NSString (MyAdditions)
- (NSString *)md5
{
    const char *cStr = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, (int)strlen(cStr), result ); // This is the md5 call
    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]
        ];  
}
@end

@implementation NSData (MyAdditions)
- (NSString*)md5
{
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( self.bytes, (int)self.length, result ); // This is the md5 call
    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]
        ];  
}
@end

EDIT

Ajouté NSData md5 parce que j'avais besoin moi-même et je pensais que c'est un bon endroit pour sauver ce petit bout ...

Ces méthodes sont vérifiées à l'aide des vecteurs de test MD5 NIST http://www.nsrl.nist.gov/testdata/

Autres conseils

Vous pouvez utiliser la bibliothèque intégrée commune Crypto de le faire. Rappelez-vous d'importer:

#import <CommonCrypto/CommonDigest.h>

et

- (NSString *) md5:(NSString *) input
{
    const char *cStr = [input UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call

    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", digest[i]];

    return  output;
}

Si la performance est importante, vous pouvez utiliser cette version optimisée. Il est environ 5 fois plus vite que ceux avec stringWithFormat ou NSMutableString.

Ceci est une catégorie de NSString.

- (NSString *)md5
{
    const char* cStr = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cStr, strlen(cStr), result);

    static const char HexEncodeChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    char *resultData = malloc(CC_MD5_DIGEST_LENGTH * 2 + 1);

    for (uint index = 0; index < CC_MD5_DIGEST_LENGTH; index++) {
        resultData[index * 2] = HexEncodeChars[(result[index] >> 4)];
        resultData[index * 2 + 1] = HexEncodeChars[(result[index] % 0x10)];
    }
    resultData[CC_MD5_DIGEST_LENGTH * 2] = 0;

    NSString *resultString = [NSString stringWithCString:resultData encoding:NSASCIIStringEncoding];
    free(resultData);

    return resultString;
}

Eh bien, puisque les gens ont demandé une version fichier-stream. Je l'ai modifié un petit extrait bien fait par Joel Lopes Da Silva qui travaille avec MD5, SHA1 et SHA512 et il est l'utilisation des flux. Son fait pour iOS, mais fonctionne seulement avec un minimum de changements sur aswell OSX (supprimer la méthode ALAssetRepresentation). Il peut faire checksums pour les fichiers donnés un filepath ou ALAssets (en utilisant ALAssetRepresentation). Ses données Chunking en petits paquets rendant l'impact minimum de mémoire quelle que soit la taille du fichier / taille de l'actif.

Il est actuellement situé ici sur github: https://github.com/leetal/FileHash

Quel est le motif de ne pas utiliser l'implémentation d'Apple: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid / TP40011172-CH9-SW1

Recherche Guide Cryptographic Services sur le site développeur d'Apple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top