Ich möchte einen String wie "abc" in einen MD5-Hash konvertieren. Ich möchte dies in iOS und Swift tun. Ich habe versucht, die folgenden Lösungen zu verwenden, aber sie haben bei mir nicht funktioniert:
CommonCrypto in ein Swift-Framework importieren
Verwendung der CC_MD5-Methode in schneller Sprache.
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
Um es klarer zu machen, möchte ich eine Ausgabe in Swift erzielen, die der Ausgabe dieses PHP-Codes ähnelt:
$str = "Hello";
echo md5($str);
Ausgabe: 8b1a9953c4611296a827abf8c47804d7
Antworten:
Es gibt zwei Schritte:
1. Erstellen Sie MD5-Daten aus einer Zeichenfolge.
2. Verdecken Sie die MD5-Daten in eine Hex-Zeichenfolge
Swift 2.0:
Ausgabe:
Swift 3.0:
Ausgabe:
Swift 5.0:
Ausgabe:
Hinweise:
#import <CommonCrypto/CommonCrypto.h>
muss zu einer Bridging-Header-Datei hinzugefügt werdenInformationen zum Erstellen eines Bridging-Headers finden Sie in dieser SO-Antwort .
Im Allgemeinen sollte MD5 nicht für neue Arbeiten verwendet werden. SHA256 ist eine aktuelle Best Practice.
Beispiel aus dem veralteten Dokumentationsabschnitt:
MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3+)
Der Parameter Name gibt den Hash - Funktion Namen als String
Unterstützte Funktionen sind MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 und SHA512 ein Dieses Beispiel erfordert ein gemeinsames Crypto
Es ist notwendig , eine Brückenkopf zum Projekt haben:
#import <CommonCrypto/CommonCrypto.h>
Fügen Sie die Sicherheit .framework zum Projekt.
Diese Funktion verwendet einen Hash-Namen und einen zu hashenden String und gibt Daten zurück:
Beispiele:
Ausgabe:
quelle
String(data: digestData, encoding: String.Encoding.utf8)
Würfefatal error: unexpectedly found nil while unwrapping an Optional value
digestData
ist. Wenn es sich um Hash-Daten handelt, ist die WahrscheinlichkeitNachdem ich die anderen Antworten hier gelesen hatte (und auch andere Hash-Typen unterstützen musste), schrieb ich eine String-Erweiterung, die mehrere Hash-Typen und Ausgabetypen behandelt.
HINWEIS: CommonCrypto ist in Xcode 10 enthalten, sodass Sie einfach
import CommonCrypto
mit einem Bridging-Header herumspielen müssen, wenn Sie die neueste Xcode-Version installiert haben. Andernfalls ist ein Bridging-Header erforderlich.UPDATE: Sowohl Swift 4 als auch Swift verwenden dieselbe String + Crypto.swift-Datei.
Es gibt eine separate Data + Crypto.swift-Datei für Swift 5 (siehe unten), da die API für 'withUnsafeMutableBytes' und 'withUnsafeBytes' zwischen Swift 4 und 5 geändert wurde.
String + Crypto.swift - (für Swift 4 & 5)
SWIFT 5 - Data + Crypto.swift
SWIFT 4 - Data + Crypto.swift
Bearbeiten: Da der Hash tatsächlich auf den Daten auftritt, habe ich den Hashing-Algorithmus in eine Datenerweiterung aufgeteilt. Auf diese Weise kann derselbe Algorithmus auch für das Fixieren von Hash-Vorgängen mit SSL-Zertifikaten verwendet werden.
Hier ist ein kurzes Beispiel, wie Sie es für einen SSL-Pinning-Vorgang verwenden können:
zurück zur ursprünglichen Antwort
Ich habe die Hash-Algorithmen folgendermaßen getestet:
und das sind die gedruckten Ergebnisse:
quelle
Ab iOS 13 hat Apple das
CryptoKit
Framework hinzugefügt, sodass Sie CommonCrypto nicht mehr importieren oder sich mit seiner C-API befassen müssen:quelle
SWIFT 3
Version vonmd5 function
:Ursprünglicher Link von http://iosdeveloperzone.com
quelle
Swift 4. *, Xcode 10 Update:
In Xcode 10 müssen Sie Bridging-Header nicht mehr verwenden, sondern können direkt mit importieren
Und dann schreibe eine Methode wie:
Verwendung :
Ausgabe:
quelle
func MD5(_ string: String) -> String? { let length = Int(CC_MD5_DIGEST_LENGTH) var digest = [UInt8](repeating: 0, count: length) if let d = string.data(using: .utf8) { _ = d.withUnsafeBytes { body -> String in CC_MD5(body.baseAddress, CC_LONG(d.count), &digest) return "" } } return (0..<length).reduce("") { $0 + String(format: "%02x", digest[$1]) } }
Ich habe eine reine Swift-Implementierung veröffentlicht , die nicht von CommonCrypto oder irgendetwas anderem abhängt. Es ist unter MIT-Lizenz erhältlich.
Der Code besteht aus einer einzelnen schnellen Datei , die Sie einfach in Ihr Projekt können. Wenn Sie möchten, können Sie auch das enthaltene Xcode-Projekt mit Framework- und Unit-Test-Zielen verwenden.
Es ist einfach zu bedienen:
Drucke:
md5: 9e107d9d372bb6826bd81d3542a419d6
Die schnelle Datei enthält Dokumentation und weitere Beispiele.
quelle
Verwenden von Crypto ist zu aufwendig, um genau dies zu erreichen.
Die akzeptierte Antwort ist perfekt! Trotzdem wollte ich nur einen Swift ier Code-Ansatz mit Swift 2.2 teilen .
Bitte beachten Sie, dass Sie dies noch
#import <CommonCrypto/CommonCrypto.h>
in Ihrer Bridging-Header- Datei tun müssenquelle
Swift 5- Antwort als String-Erweiterung (basierend auf der großartigen Antwort von Invictus Cody ):
Verwendung:
quelle
Hier ist eine Erweiterung basierend auf Zaph Antwort
Voll kompatibel mit Swift 3.0. Sie müssen sich noch
#import <CommonCrypto/CommonCrypto.h>
in Ihrer Bridging-Header-Datei befindenquelle
Bei der schnellen Programmierung ist es besser, eine Zeichenfolgefunktion zu erstellen, damit die Verwendung einfach ist. Hier mache ich eine String-Erweiterung mit einer der oben angegebenen Lösungen. Danke @wajih
Verwendung
quelle
Ich habe dazu Karthago und Cyrpto benutzt.
Installieren Sie Karthago, falls Sie dies noch nicht getan haben
Installieren Sie Crypto in Ihrem Projekt
'Cartage Update' ausführen
Wenn Sie über die Befehlszeile ausgeführt werden, fügen Sie das Framework in die Swift-Datei ein
Fügen Sie Ihrer schnellen Datei Import Crypto hinzu.
dann funktioniert es einfach!
quelle
MD5 ist ein Hashing-Algorithmus. Sie müssen hierfür nicht die umfangreiche CommonCrypto-Bibliothek verwenden (und werden von Apple abgelehnt). Verwenden Sie einfach eine beliebige MD5-Hashing-Bibliothek.
Eine solche Bibliothek, die ich benutze, ist SwiftHash , eine reine schnelle Implementierung von MD5 (basierend auf http://pajhome.org.uk/crypt/md5/md5.html ).
quelle
Basierend auf Codys Lösung habe ich die Idee, dass wir klären sollten, was das Ergebnis von MD5 ist, da wir das Ergebnis möglicherweise als Hex-Zeichenfolge oder Base64-Zeichenfolge verwenden.
Die obige Funktion gibt tatsächlich a zurück
[UInt8]
, und basierend auf diesem Ergebnis können wir jede Form von Zeichenfolge erhalten, z. B. hex, base64.Wenn eine Hex-Zeichenfolge als Endergebnis gewünscht wird (wie in der Frage gestellt), können wir den Rest der Cody-Lösung weiterhin verwenden
Wenn eine Base64-Zeichenfolge als Endergebnis gewünscht wird
quelle
Eine Antwort für Swift 5 mit ordnungsgemäßer Speicherverwaltung und ohne
String
Klasse innerhalb der Methode:Beispiel
Ergebnisse:
quelle
Ich habe diese Bibliothek gefunden, die ziemlich gut zu funktionieren scheint.
https://github.com/onmyway133/SwiftHash
quelle
meine zwei Cent (wenn Sie schnell md5 für Data / NSData benötigen, zum Beispiel haben Sie Binärdateien für Disk oder Netwkork heruntergeladen oder gelesen)
(schamlos aus "Swift 5-Antwort als String-Erweiterung (basierend auf der großartigen Antwort von Invictus Cody")):
Prüfung:
quelle