Saya ingin mengubah string seperti "abc" menjadi hash MD5. Saya ingin melakukan ini di iOS dan Swift. Saya telah mencoba menggunakan solusi di bawah ini tetapi tidak berhasil untuk saya:
Mengimpor CommonCrypto dalam kerangka Swift
Cara menggunakan metode CC_MD5 dalam bahasa cepat.
http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
Untuk lebih jelasnya, saya ingin mencapai keluaran di Swift yang mirip dengan keluaran kode PHP ini:
$str = "Hello";
echo md5($str);
Keluaran: 8b1a9953c4611296a827abf8c47804d7
Jawaban:
Ada dua langkah:
1. Membuat data md5 dari string
2. Menyamarkan data md5 menjadi string hex
Swift 2.0:
Keluaran:
Swift 3.0:
Keluaran:
Swift 5.0:
Keluaran:
Catatan:
#import <CommonCrypto/CommonCrypto.h>
harus ditambahkan ke file Bridging-HeaderUntuk cara membuat Bridging-Header lihat jawaban SO ini .
Secara umum MD5 tidak boleh digunakan untuk pekerjaan baru, SHA256 adalah praktik terbaik saat ini.
Contoh dari bagian dokumentasi yang tidak digunakan lagi:
MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3+)
Parameter nama menentukan nama fungsi hash sebagai String
Fungsi yang didukung adalah MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384 dan SHA512 a Contoh ini memerlukan Common Crypto
Perlu memiliki header penghubung ke proyek:
#import <CommonCrypto/CommonCrypto.h>
Tambahkan Keamanan .framework untuk proyek.
Fungsi ini mengambil nama hash dan String untuk di-hash dan mengembalikan Data:
Contoh:
Keluaran:
sumber
String(data: digestData, encoding: String.Encoding.utf8)
melemparfatal error: unexpectedly found nil while unwrapping an Optional value
digestData
. Jika itu adalah data hash, kemungkinannya atau itu UTF-8 (atau pengkodean string apa pun sangat tipis hingga tidak ada.Setelah membaca jawaban lain di sini (dan perlu mendukung jenis hash lainnya juga) saya menulis ekstensi String yang menangani beberapa jenis hash dan jenis keluaran.
CATATAN: CommonCrypto disertakan dalam Xcode 10, jadi Anda dapat dengan mudah
import CommonCrypto
tanpa harus mengacaukan header bridging jika Anda menginstal versi Xcode terbaru ... Jika tidak, diperlukan header bridging.UPDATE: Baik Swift 4 & 5 menggunakan file String + Crypto.swift yang sama di bawah ini.
Ada file Data + Crypto.swift terpisah untuk Swift 5 (lihat di bawah) sebagai api untuk 'withUnsafeMutableBytes' dan 'withUnsafeBytes' diubah antara Swift 4 & 5.
String + Crypto.swift - (untuk Swift 4 & 5)
SWIFT 5 - Data + Crypto.swift
SWIFT 4 - Data + Crypto.swift
Sunting: karena hash benar-benar terjadi pada Data, saya membagi algoritma hashing menjadi ekstensi Data. Hal ini memungkinkan algoritme yang sama digunakan untuk operasi hash penyematan Sertifikat SSL juga.
Berikut adalah contoh singkat bagaimana Anda dapat menggunakannya untuk operasi Penyematan SSL:
kembali ke jawaban awal
Saya menguji algoritma hash menggunakan ini:
dan ini hasil cetakannya:
sumber
Mulai iOS 13 Apple telah menambahkan
CryptoKit
kerangka kerja sehingga Anda tidak perlu lagi mengimpor CommonCrypto atau berurusan dengan C API-nya:sumber
SWIFT 3
versi darimd5 function
:Tautan asli dari http://iosdeveloperzone.com
sumber
Swift 4. *, Pembaruan Xcode 10:
Di Xcode 10 Anda tidak harus menggunakan Bridging-Header Anymore, Anda dapat langsung mengimpor menggunakan
Dan kemudian tulis metode seperti:
Penggunaan:
Keluaran:
sumber
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]) } }
Saya merilis implementasi Swift murni yang tidak bergantung pada CommonCrypto atau apa pun. Ini tersedia di bawah lisensi MIT.
Kode ini terdiri dari satu file swift yang bisa Anda masukkan ke dalam proyek Anda. Jika mau, Anda juga dapat menggunakan proyek Xcode yang dimuat dengan kerangka kerja dan target pengujian unit.
Mudah digunakan:
cetakan:
md5: 9e107d9d372bb6826bd81d3542a419d6
File swift berisi dokumentasi dan lebih banyak contoh.
sumber
Menggunakan Crypto terlalu berlebihan untuk mencapai hal ini.
The jawaban yang diterima adalah sempurna! Namun saya hanya ingin berbagi Swift IER pendekatan kode menggunakan Swift 2.2 .
Harap diingat bahwa Anda masih harus
#import <CommonCrypto/CommonCrypto.h>
di Anda Bridging-Header Filesumber
Jawaban Swift 5 sebagai ekstensi String (berdasarkan jawaban hebat Invictus Cody ):
Pemakaian:
sumber
Berikut ekstensi berdasarkan jawaban zaph
Sepenuhnya kompatibel dengan swift 3.0. Anda masih harus
#import <CommonCrypto/CommonCrypto.h>
menggunakan file Bridging-Header Andasumber
Dalam pemrograman cepat sebaiknya membuat fungsi string, agar penggunaannya mudah. Di sini saya membuat ekstensi String menggunakan salah satu solusi yang diberikan di atas. Terima kasih @wajih
Pemakaian
sumber
Saya menggunakan Carthage dan Cyrpto untuk melakukan ini.
Instal Carthage jika Anda belum melakukannya
Instal Crypto ke dalam proyek Anda
jalankan 'update cartage'
Jika Anda menjalankan dari baris perintah, tambahkan kerangka kerja di file swift
Tambahkan impor Crypto ke file swift Anda.
maka itu akan berhasil!
sumber
MD5 adalah algoritma hashing, tidak perlu menggunakan pustaka CommonCrypto yang besar untuk ini (dan ditolak oleh tinjauan Apple), cukup gunakan pustaka hashing md5.
Salah satu pustaka yang saya gunakan adalah SwiftHash , implementasi cepat murni MD5 (berdasarkan http://pajhome.org.uk/crypt/md5/md5.html )
sumber
Berdasarkan solusi Cody , saya punya ide bahwa kita harus mengklarifikasi apa hasil dari MD5, karena kita dapat menggunakan hasilnya sebagai string hex, atau string Base64.
Fungsi di atas sebenarnya mengembalikan a
[UInt8]
, dan berdasarkan hasil ini, kita bisa mendapatkan bentuk string apa pun, seperti hex, base64.Jika string hex diinginkan sebagai hasil akhir (seperti pertanyaan yang diajukan), kita dapat tetap menggunakan bagian lain dari solusi Cody
Jika string Base64 diinginkan sebagai hasil akhir
sumber
Jawaban untuk Swift 5 dengan manajemen memori yang tepat dan tanpa
String
kelas di dalam metode:contoh
Hasil:
sumber
Saya menemukan perpustakaan ini yang tampaknya berfungsi dengan baik.
https://github.com/onmyway133/SwiftHash
sumber
dua sen saya (jika Anda membutuhkan md5 cepat untuk Data / NSData, misalnya Anda mengunduh atau membaca biner untuk disk atau netwkork)
(tidak tahu malu dari "jawaban Swift 5 sebagai ekstensi String (berdasarkan jawaban hebat Invictus Cody")):
uji:
sumber