التشفير في Swift (iOS/macOS): التشفير والتجزئة
أمان البيانات هو جانب أساسي في تطوير تطبيقات iOS و macOS. يوفر Swift أدوات قوية للحماية التشفيرية: من إطار العمل المدمج CryptoKit (بدءًا من iOS 13 / macOS 10.15) إلى المكتبة منخفضة المستوى CommonCrypto (مكتبة C). في هذه المقالة، سنستعرض العمليات الأساسية: التشفير المتماثل (AES)، التشفير غير المتماثل (RSA)، التجزئة (SHA-256)، وتوثيق الرسائل (HMAC).
1. إعداد المشروع
لا يتطلب استخدام CryptoKit أي إعدادات إضافية - فهو جزء من مكتبة Foundation القياسية. إذا كنت تعمل مع CommonCrypto، أضفه في Bridging-Header (لـ Swift + ObjC) أو قم باستيراد الوحدة مباشرة:
// لاستخدام CommonCrypto في Swift 5+ يمكنك استخدام:import CommonCrypto// أو إعداد جسر وحدات (modulemap)2. التشفير المتماثل (AES-GCM) باستخدام CryptoKit
يوفر CryptoKit واجهة برمجة تطبيقات عالية المستوى لـ AES في وضع GCM (Galois/Counter Mode) - وهي طريقة آمنة وبسيطة للتشفير.
import CryptoKitimport Foundation
// دالة تشفير سلسلة نصيةfunc encryptString(_ plaintext: String, using key: SymmetricKey) throws -> Data { let plaintextData = plaintext.data(using: .utf8)! let sealedBox = try AES.GCM.seal(plaintextData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
// دالة فك التشفيرfunc decryptData(_ combinedData: Data, using key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: combinedData) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// مثال على الاستخدامlet key = SymmetricKey(size: .bits256) // مفتاح 256 بتlet original = "رسالة سرية لنظام iOS"let encrypted = try encryptString(original, using: key)print("مشفر: \\(encrypted.base64EncodedString())")
let decrypted = try decryptData(encrypted, using: key)print("مفكوك التشفير: \\(decrypted)")هام: يتم إنشاء SymmetricKey بشكل عشوائي. للتطبيق الفعلي، يجب تخزين المفتاح في Keychain أو استخدام Secure Enclave.
3. التجزئة (SHA-256) و HMAC
التجزئة هي دالة أحادية الاتجاه، لا غنى عنها للتحقق من سلامة البيانات وتخزين كلمات المرور. يدعم CryptoKit SHA-256 و SHA-384 و SHA-512.
import CryptoKit
func sha256Hash(of data: Data) -> String { let digest = SHA256.hash(data: data) return digest.compactMap { String(format: "%02x", $0) }.joined()}
// مثال لسلسلة نصيةlet message = "Hello, Swift Crypto!"let hash = sha256Hash(of: message.data(using: .utf8)!)print("SHA-256: \\(hash)")لتوثيق الرسائل (HMAC)، استخدم HMAC مع مفتاح:
func hmacSHA256(key: SymmetricKey, data: Data) -> Data { let authenticationCode = HMAC<SHA256>.authenticationCode(for: data, using: key) return Data(authenticationCode)}
let hmacKey = SymmetricKey(size: .bits256)let hmacResult = hmacSHA256(key: hmacKey, data: "بيانات هامة".data(using: .utf8)!)print("HMAC: \\(hmacResult.base64EncodedString())")4. التشفير غير المتماثل (RSA) عبر إطار Security
لاستخدام RSA، استخدم إطار العمل Security (SecKey). لا يدعم CryptoKit RSA بشكل مباشر، ولكن يمكنك الجمع بين الأساليب.
import Security
// إنشاء زوج مفاتيح RSA (2048 بت)func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kS