Chcę przekonwertować ciąg, taki jak „abc”, na skrót MD5. Chcę to zrobić w iOS i Swift. Próbowałem użyć poniższych rozwiązań, ale nie działały one dla mnie:
Importowanie CommonCrypto w środowisku Swift
Jak korzystać z metody CC_MD5 w języku Swift.
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
Aby być bardziej zrozumiałym, chcę uzyskać wynik w Swift podobny do wyniku tego kodu PHP:
$str = "Hello";
echo md5($str);
Wyjście: 8b1a9953c4611296a827abf8c47804d7
Odpowiedzi:
Istnieją dwa kroki:
1. Utwórz dane md5 z łańcucha
2. Zamień dane md5 na ciąg szesnastkowy
Swift 2.0:
Wynik:
Swift 3.0:
Wynik:
Swift 5.0:
Wynik:
Uwagi:
#import <CommonCrypto/CommonCrypto.h>
należy dodać do pliku Bridging-HeaderAby dowiedzieć się, jak utworzyć nagłówek mostkujący, zobacz tę odpowiedź SO .
Generalnie MD5 nie powinien być używany do nowych prac, SHA256 jest obecnie najlepszą praktyką.
Przykład z przestarzałej sekcji dokumentacji:
MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3+)
Parametr name określa nazwę funkcji skrótu jako ciąg
znaków Obsługiwane funkcje to MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 i SHA512 a Ten przykład wymaga Common Crypto
Konieczne jest posiadanie nagłówka mostkowania do projektu:
#import <CommonCrypto/CommonCrypto.h>
Dodaj zabezpieczenia .framework do projektu.
Ta funkcja przyjmuje nazwę skrótu i ciąg znaków do zaszyfrowania i zwraca Data:
Przykłady:
Wynik:
źródło
String(data: digestData, encoding: String.Encoding.utf8)
rzutyfatal error: unexpectedly found nil while unwrapping an Optional value
digestData
jest. Jeśli są to dane haszujące, istnieje prawdopodobieństwo, że będzie to UTF-8 (lub jakiekolwiek kodowanie ciągów jest niewielkie lub nie istnieje.Po przeczytaniu innych odpowiedzi tutaj (i konieczności obsługi również innych typów skrótów) napisałem rozszerzenie String, które obsługuje wiele typów skrótów i typów danych wyjściowych.
UWAGA: CommonCrypto jest zawarte w Xcode 10, więc możesz po prostu
import CommonCrypto
bez bałaganu z nagłówkiem mostkującym, jeśli masz zainstalowaną najnowszą wersję Xcode ... W przeciwnym razie nagłówek mostkujący jest konieczny.AKTUALIZACJA: Zarówno Swift 4, jak i 5 używają tego samego pliku String + Crypto.swift poniżej.
Istnieje oddzielny plik Data + Crypto.swift dla Swift 5 (patrz poniżej) jako interfejs API dla „withUnsafeMutableBytes” i „withUnsafeBytes” zmieniony między Swift 4 i 5.
String + Crypto.swift - (dla Swift 4 i 5)
SWIFT 5 - Dane + Crypto.swift
SWIFT 4 - Dane + Crypto.swift
Edycja: ponieważ hash faktycznie dzieje się na danych, podzieliłem algorytm haszowania na rozszerzenie danych. Pozwala to na użycie tego samego algorytmu do przypinania operacji skrótu certyfikatu SSL.
Oto krótki przykład tego, jak możesz go użyć do operacji przypinania SSL:
z powrotem do pierwotnej odpowiedzi
Przetestowałem algorytmy skrótu, używając tego:
a oto wydrukowane wyniki:
źródło
Od iOS 13 Apple dodał
CryptoKit
framework, więc nie musisz już importować CommonCrypto ani zajmować się jego C API:źródło
SWIFT 3
wersjamd5 function
:Oryginalny link z http://iosdeveloperzone.com
źródło
Swift 4. *, aktualizacja Xcode 10:
W Xcode 10 nie musisz już używać Bridging-Header , możesz bezpośrednio importować za pomocą
Następnie napisz metodę taką jak:
Stosowanie :
Wynik:
źródło
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]) } }
Wydałem czystą implementację Swift , która nie zależy od CommonCrypto ani niczego innego. Jest dostępny na licencji MIT.
Kod składa się z pojedynczego pliku Swift , który możesz po prostu wrzucić do projektu. Jeśli wolisz, możesz również użyć zawartego projektu Xcode z obiektami docelowymi testów strukturalnych i jednostkowych.
Jest prosty w użyciu:
wydruki:
md5: 9e107d9d372bb6826bd81d3542a419d6
Plik swift zawiera dokumentację i więcej przykładów.
źródło
Korzystanie z Crypto jest zbyt dużym obciążeniem, aby to osiągnąć.
Odpowiedź akceptowana jest idealny! Niemniej jednak chciałem tylko podzielić się podejściem do kodu Swift ier przy użyciu Swift 2.2 .
Pamiętaj, że nadal musisz mieć to
#import <CommonCrypto/CommonCrypto.h>
w pliku Bridging-Headerźródło
Odpowiedź Swift 5 jako rozszerzenie String (w oparciu o świetną odpowiedź Invictus Cody ):
Stosowanie:
źródło
Oto rozszerzenie oparte na odpowiedzi zaph
W pełni kompatybilny ze swift 3.0. Nadal musisz mieć
#import <CommonCrypto/CommonCrypto.h>
w swoim pliku Bridging-Headerźródło
W szybkim programowaniu lepiej jest utworzyć funkcję łańcuchową, więc użycie będzie łatwe. Tutaj robię rozszerzenie String przy użyciu jednego z podanych powyżej rozwiązań. Dzięki @wajih
Stosowanie
źródło
Wykorzystałem do tego Kartaginę i Cyrpto.
Zainstaluj Kartaginę, jeśli jeszcze tego nie zrobiłeś
Zainstaluj Crypto w swoim projekcie
wykonaj „aktualizację wózka”
Jeśli korzystasz z wiersza poleceń, dodaj strukturę w pliku Swift
Dodaj import Crypto do swojego pliku Swift.
to po prostu działa!
źródło
MD5 to algorytm haszujący, nie ma potrzeby używania do tego obszernej biblioteki CommonCrypto (i zostaje odrzucony przez przegląd Apple), po prostu użyj dowolnej biblioteki haszującej md5.
Jedną z takich bibliotek, których używam, jest SwiftHash , czysta szybka implementacja MD5 (oparta na http://pajhome.org.uk/crypt/md5/md5.html )
źródło
Opierając się na rozwiązaniu Cody'ego , mam pomysł, że powinniśmy wyjaśnić, jaki jest wynik MD5, ponieważ możemy użyć wyniku jako ciągu szesnastkowego lub ciągu Base64.
Powyższa funkcja w rzeczywistości zwraca a
[UInt8]
i na podstawie tego wyniku możemy uzyskać dowolną formę ciągu, na przykład hex, base64.Jeśli jako wynik końcowy (jak zadaje się pytanie) potrzebny jest ciąg szesnastkowy, możemy nadal używać pozostałej części rozwiązania Cody'ego
Jeśli jako wynik końcowy wymagany jest ciąg Base64
źródło
Odpowiedź na Swift 5 z odpowiednim zarządzaniem pamięcią i bez
String
klasy wewnątrz metody:przykład
Wyniki:
źródło
Znalazłem tę bibliotekę, która wydaje się działać całkiem nieźle.
https://github.com/onmyway133/SwiftHash
źródło
moje dwa centy (jeśli potrzebujesz szybko md5 dla danych / NSData, na przykład pobrałeś lub przeczytałeś plik binarny na dysk lub sieć)
(bezwstydne z „Swift 5 answer as a String extension (w oparciu o wspaniałą odpowiedź Invictus Cody”)):
test:
źródło