التشفير في Swift (iOS/macOS): التشفير والتجزئة
في التطوير الحديث لنظامي iOS وmacOS، تعتبر أمان البيانات من الأولويات الرئيسية. توفر Apple أدوات مدمجة قوية للحماية التشفيرية: من التجزئة البسيطة إلى التشفير غير المتماثل. في هذه المقالة، سنستعرض كيفية استخدام CryptoKit (الإطار الموصى به بدءًا من iOS 13 / macOS 10.15) و CommonCrypto الكلاسيكي لحل المهام النموذجية: التشفير، التجزئة، والتحقق من صحة البيانات.
المفاهيم الأساسية
قبل الانتقال إلى الكود، دعنا نفهم المصطلحات:
- التشفير المتماثل — يتم استخدام مفتاح واحد لكل من التشفير وفك التشفير (مثل AES).
- التشفير غير المتماثل — زوج من المفاتيح: مفتاح عام (للتشفير) ومفتاح خاص (لفك التشفير).
- التجزئة — تحويل البيانات بشكل لا رجعة فيه إلى سلسلة ذات طول ثابت (SHA-256).
- HMAC — رمز مصادقة الرسالة المعتمد على التجزئة باستخدام مفتاح.
1. التجزئة باستخدام CryptoKit
CryptoKit هو إطار Swift حديث يجعل التشفير بسيطًا وآمنًا. للتجزئة، يتم استخدام الهيكل SHA256.
import CryptoKit
func hashString(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}
// مثال الاستخدامlet password = "MySecurePass123"let hash = hashString(password)print("SHA-256 hash: \\(hash)")كما تتوفر SHA384 و SHA512 و SHA1 (الأخير للتوافق فقط).
2. HMAC (مصادقة الرسالة)
يضيف HMAC مفتاحًا إلى التجزئة، مما يحمي من التزوير. في CryptoKit، يتم ذلك عبر HMAC مع تحديد الخوارزمية:
import CryptoKit
func hmacSHA256(key: SymmetricKey, message: String) -> String { let messageData = Data(message.utf8) let code = HMAC<SHA256>.authenticationCode(for: messageData, using: key) return code.compactMap { String(format: "%02x", $0) }.joined()}
// توليد المفتاحlet key = SymmetricKey(size: .bits256)let hmac = hmacSHA256(key: key, message: "رسالة مهمة")print("HMAC: \\(hmac)")3. التشفير المتماثل (AES-GCM)
AES-GCM هو وضع تشفير حديث يوفر السرية والمصادقة (يمنع التلاعب بالبيانات). يدعمه CryptoKit بشكل مدمج.
import CryptoKit
func encryptAESGCM(plainText: String, key: SymmetricKey) throws -> Data { let plainData = Data(plainText.utf8) let sealedBox = try AES.GCM.seal(plainData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
func decryptAESGCM(encryptedData: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: encryptedData) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// مثالlet key = SymmetricKey(size: .bits256)let originalText = "بيانات سرية"
do { let encrypted = try encryptAESGCM(plainText: originalText, key: key) let decrypted = try decryptAESGCM(encryptedData: encrypted, key: key) print("تم فك التشفير: \\(decrypted)")} catch { print("خطأ: \\(error)")}هام: combined يتضمن كل ما هو ضروري لفك التشفير (nonce, ciphertext, tag). قم بتخزينه مع البيانات المشفرة.
4. التشفير غير المتماثل (RSA) عبر CommonCrypto
بالنسبة لـ RSA، لا يوفر CryptoKit واجهة برمجة تطبيقات مباشرة، ولكن يمكن استخدام Security.framework و CommonCrypto
أيضاً في المكتبة
توصيات