algorithme MD5 en Objective-C
-
19-09-2019 - |
Question
Comment calculer le MD5 en Objective-C?
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.