MD5-Algorithmus in Objective-C

Antworten:

219

md5 ist auf dem iPhone verfügbar und kann als Ergänzung für dh NSStringund NSDatawie unten hinzugefügt werden.

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

BEARBEITEN

NSData md5 wurde hinzugefügt, weil ich es selbst brauchte und dachte, dies sei ein guter Ort, um dieses kleine Snippet zu speichern ...

Diese Methoden werden anhand der NIST MD5-Testvektoren unter http://www.nsrl.nist.gov/testdata/ überprüft.

Epatel
quelle
Zieht dies die gesamte Datei in den Speicher?
openfrog
Hier geht es nicht um Dateien. Wenn Sie mit diesen Methoden eine MD5 aus einer Datei erstellen möchten, können Sie NSData * fileContents = [NSData dataWithContentsOfFile: @ "<IhrPfad>"] ausführen. NSString * myHash = [fileContents md5]; Und ja, dies würde die gesamte Datei in den Speicher ziehen. Wenn Sie eine Lösung finden, die mit Dateistreams funktioniert, senden Sie diese bitte als Antwort.
Klaas
1
Wenn Sie eine Hash-Datei benötigen, sollten Sie CC_MD5_Init, dann CC_MD5_Update für alle Dateidaten und danach - CC_MD5_Finish verwenden.
Nickolay Olshevsky
7
Beim Kompilieren für eine 64-Bit-Architektur wird beim Aufruf von strlendie Warnung ausgegeben: "Die implizite Konvertierung verliert an ganzzahliger Genauigkeit: 'unsigned long' in 'CC_LONG' (auch bekannt als 'unsigned int')"
MaxGabriel
55

Sie können dazu die integrierte Common Crypto-Bibliothek verwenden. Denken Sie daran zu importieren:

#import <CommonCrypto/CommonDigest.h>

und dann:

- (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;
}
Bruno Koga
quelle
Ich habe den obigen Code implementiert, aber während der Ausführung der Anwendung stürzt sie ab (CC_MD5 (cStr, strlen (cStr), Digest) ----> Diese Zeile löst eine Ausnahme mit der Aufschrift EXC_BAD_ACCESS aus)
Nilesh Kumar,
@wimcNilesh selfvor der Ausführung prüfen ; Wenn das Selbst Null ist, stürzt es ab.
Brandonscript
4
Diese Antwort ist viel sauberer zu lesen als die anderen; Eine Sache, die es braucht, ist eine Besetzung (int)vor strlenzB (int)strlen...
Brandonscript
Hay Dies ist eine nette +1 Gegenstimme. Und können Sie bitte auch die md5-Entschlüsselungsmethode angeben, die der Ihrer Verschlüsselung entspricht?
Ayaz
@ Ayaz MD5 kann nicht entschlüsselt werden (zumindest einfach mit einer Methode).
Albanx
9

Wenn die Leistung wichtig ist, können Sie diese optimierte Version verwenden. Es ist ungefähr 5 mal schneller als die mit stringWithFormatoder NSMutableString.

Dies ist eine Kategorie von 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;
}
Pavel Alexeev
quelle
0

Nun, da die Leute nach einer File-Stream-Version gefragt haben. Ich habe ein nettes kleines Snippet von Joel Lopes Da Silva modifiziert, das mit MD5, SHA1 und SHA512 funktioniert UND Streams verwendet. Es wurde für iOS entwickelt, funktioniert aber auch unter OSX mit nur minimalen Änderungen (entfernen Sie die ALAssetRepresentation-Methode). Es kann Prüfsummen für Dateien erstellen, denen ein Dateipfad oder ALAssets zugewiesen wurden (mithilfe von ALAssetRepresentation). Es zerlegt Daten in kleine Pakete, wodurch die Auswirkungen auf den Speicher unabhängig von der Dateigröße / Asset-Größe minimal werden.

Es befindet sich derzeit auf Github hier: https://github.com/leetal/FileHash

Alexander W.
quelle
Der Code, den Joel veröffentlicht hat, hat eine Rennbedingung und es sieht so aus, als ob Ihre ihn erben könnte. Siehe den Kommentar, den ich in Joels Beitrag veröffentlicht habe. joel.lopes-da-silva.com/2010/09/07/…
xyzzycoder
Vielen Dank! Jetzt gepatcht. Dies war für mich nie ein Problem, da ich es in der ursprünglichen Implementierung immer in einem dedizierten Thread ausgeführt habe;)
Alexander W
0

Jeder Grund, die Apple-Implementierung nicht zu verwenden: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1

Suchen Sie auf der Apple-Entwicklerseite nach Cryptographic Services Guide.

vpathak
quelle
Der Link behandelt Common Crypto, das in den meisten Antworten hier verwendet wird.
Zaph
1
Sicher ist der Algo der gleiche. Beachten Sie jedoch, dass die Implementierung Ihres eigenen Krypto-Algorithmus zu Fehlern führen kann. Es ist sehr hart, um es in allen Szenarien richtig zu machen . Daher ist im allgemeinen Fall die Verwendung der Bibliotheksversion vorzuziehen.
Vpathak