التشفير في Swift (iOS/macOS): التشفير والتجزئة
في التطوير الحديث لنظامي iOS وmacOS، أمان البيانات هو جانب بالغ الأهمية. يوفر Swift أدوات مدمجة قوية للتشفير، بدءًا من CommonCrypto منخفض المستوى (C-API) وصولاً إلى الإطار الحديث CryptoKit (iOS 13+/macOS 10.15+). في هذه المقالة، سنستعرض طرق التشفير والتجزئة الرئيسية المتاحة لمطور Swift.
1. التجزئة (Hashing)
التجزئة هي تحويل أحادي الاتجاه للبيانات إلى سلسلة ذات طول ثابت. تُستخدم للتحقق من سلامة البيانات وتخزين كلمات المرور (مع الملح).
مثال باستخدام CryptoKit (SHA-256)
import CryptoKit
func hashSHA256(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}
// الاستخدامlet hash = hashSHA256("Hello, Swift!")print("SHA-256: \\(hash)")// الإخراج: 8e3a... (64 حرفًا)مثال باستخدام CommonCrypto (MD5، قديم)
ملاحظة: لا يُوصى باستخدام MD5 للأمان، ولكن يمكن استخدامه للتحقق من السلامة.
import CommonCrypto
func md5Hash(_ input: String) -> String { let data = Data(input.utf8) var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) data.withUnsafeBytes { bytes in _ = CC_MD5(bytes.baseAddress, CC_LONG(data.count), &digest) } return digest.map { String(format: "%02x", $0) }.joined()}2. التشفير المتماثل (AES-GCM)
يستخدم التشفير المتماثل مفتاحًا واحدًا للتشفير وفك التشفير. يوفر CryptoKit تطبيقًا آمنًا لـ AES-GCM (وضع Galois/Counter).
مثال للتشفير وفك التشفير باستخدام CryptoKit
import CryptoKit
func encryptAESGCM(plaintext: String, key: SymmetricKey) throws -> Data { let plaintextData = Data(plaintext.utf8) let sealedBox = try AES.GCM.seal(plaintextData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
func decryptAESGCM(ciphertext: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: ciphertext) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// الاستخدامlet key = SymmetricKey(size: .bits256) // مفتاح 256 بتlet encrypted = try encryptAESGCM(plaintext: "رسالة سرية", key: key)let decrypted = try decryptAESGCM(ciphertext: encrypted, key: key)print("تم فك التشفير: \\(decrypted)")3. التشفير غير المتماثل (RSA)
يستخدم التشفير غير المتماثل زوجًا من المفاتيح: عام (للتشفير) وخاص (لفك التشفير). في iOS/macOS، يُستخدم Security.framework و SecKey للعمل مع RSA.
مثال لتوليد المفاتيح وتشفير RSA
import Security
func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false], kSecPublicKeyAttrs as String: [kSecAttrIsPermanent as String: false] ] guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, nil) else { return nil } let publicKey = SecKeyCopyPublicKey(privateKey)! return (privateKey, publicKey)}
func encryptRSA(plaintext: String, publicKey: SecKey) -> Data? { let plaintextData = Data(plaintext.utf8) var error: Unmanaged<CFError>? guard let ciphertext = SecKeyCreateEncryptedData( publicKey, .rsaEncryptionPKCS1, plaintextData as CFData,