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
{constchar*cStr =[input UTF8String];unsignedchar digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest );// This is the md5 callNSMutableString*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;}
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.
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.
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;)
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.
Antworten:
md5 ist auf dem iPhone verfügbar und kann als Ergänzung für dh
NSString
undNSData
wie unten hinzugefügt werden.MyAdditions.h
MyAdditions.m
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.
quelle
strlen
die Warnung ausgegeben: "Die implizite Konvertierung verliert an ganzzahliger Genauigkeit: 'unsigned long' in 'CC_LONG' (auch bekannt als 'unsigned int')"Sie können dazu die integrierte Common Crypto-Bibliothek verwenden. Denken Sie daran zu importieren:
und dann:
quelle
self
vor der Ausführung prüfen ; Wenn das Selbst Null ist, stürzt es ab.(int)
vorstrlen
zB(int)strlen
...Wenn die Leistung wichtig ist, können Sie diese optimierte Version verwenden. Es ist ungefähr 5 mal schneller als die mit
stringWithFormat
oderNSMutableString
.Dies ist eine Kategorie von NSString.
quelle
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
quelle
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.
quelle