CryptoKit لـ Swift: دليل شامل مع أمثلة تطبيقية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو CryptoKit وما أهميته؟

CryptoKit هو إطار عمل (Framework) للعمليات التشفيرية، طورته شركة Apple ومدمج مباشرة في بيئة Swift. وهو متاح بدءًا من iOS 13 وmacOS 10.15 وwatchOS 6 وtvOS 13. على عكس المكتبات الخارجية، يعتبر CryptoKit حلاً أصليًا، مما يضمن أداءً عاليًا وأمانًا وتكاملاً كاملاً مع نظام إدارة المفاتيح Secure Enclave.

لماذا تحتاج CryptoKit؟ في تطوير التطبيقات الحديثة، أصبح أمن البيانات في الصدارة. يوفر CryptoKit للمطورين واجهة بسيطة لكنها قوية من أجل:

  • تجزئة البيانات (Hashing) (SHA-256, SHA-384, SHA-512)
  • التشفير المتماثل (Symmetric Encryption) (AES-GCM, ChaCha20-Poly1305)
  • التشفير غير المتماثل (Asymmetric Encryption) (Curve25519, P-256, P-384, P-521)
  • التوقيعات الرقمية (Digital Signatures) (EdDSA, ECDSA)
  • توليد أرقام عشوائية آمنة تشفيريًا
  • تبادل المفاتيح (Key Exchange) (Diffie-Hellman على المنحنيات الإهليلجية)

صُممت المكتبة لتقليل أخطاء المطور: فهي تستخدم تطبيقات آمنة افتراضيًا، وتدير الذاكرة تلقائيًا، ولا تسمح باستخدام خوارزميات قديمة أو غير آمنة (مثل MD5 أو SHA-1 للتوقيعات).

تثبيت CryptoKit

نظرًا لأن CryptoKit جزء من المكتبة القياسية لـ Apple، لا تحتاج إلى تثبيته عبر مديري الحزم (CocoaPods, Swift Package Manager أو Carthage). كل ما تحتاجه هو مشروع بحد أدنى من الإصدار المستهدف iOS 13+ أو macOS 10.15+.

هام: إذا كنت تطور لإصدارات أقدم من نظام التشغيل، فإن CryptoKit غير متاح. في هذه الحالة، استخدم CommonCrypto (مستوى C) أو مكتبات خارجية (مثل CryptoSwift).

للتحقق من توفر CryptoKit في الكود، استخدم:

import CryptoKit

if #available(iOS 13.0, macOS 10.15, *) {
    // كود CryptoKit الخاص بك
} else {
    // الرجوع إلى CommonCrypto
}

بداية سريعة مع مثال برمجي

لنلقِ نظرة على مثال بسيط: تجزئة سلسلة نصية وتشفير متماثل.

import CryptoKit
import Foundation

// 1. التجزئة (Hashing)
let inputString = "مرحبًا، CryptoKit!"
let inputData = Data(inputString.utf8)
let hash = SHA256.hash(data: inputData)
print("تجزئة SHA256: \(hash.compactMap { String(format: "%02x", $0) }.joined())")

// 2. التشفير المتماثل (AES-GCM)
let key = SymmetricKey(size: .bits256) // توليد مفتاح 256 بت
let plaintext = "رسالة سرية".data(using: .utf8)!

do {
    let sealedBox = try AES.GCM.seal(plaintext, using: key)
    print("البيانات المشفرة: \(sealedBox.ciphertext.base64EncodedString())")
    
    // فك التشفير
    let openedBox = try AES.GCM.open(sealedBox, using: key)
    let decryptedString = String(data: openedBox, encoding: .utf8)!
    print("الرسالة المفكوكة: \(decryptedString)")
} catch {
    print("خطأ في التشفير: \(error)")
}

الدوال والوظائف الأساسية في CryptoKit

فيما يلي 10 دوال رئيسية في CryptoKit مع شرح مفصل، المعاملات، والأمثلة.

1. SHA256.hash(data:)

الوصف: يحسب تجزئة SHA-256 للبيانات المُمررة. يُرجع كائنًا من نوع SHA256Digest.

المعاملات:

  • data: Data — البيانات الأصلية المراد تجزئتها.

مثال:

let data = "بيانات مثال".data(using: .utf8)!
let digest = SHA256.hash(data: data)
print(digest.description) // الإخراج: SHA256 digest: 8f4343... (64 حرفًا)

2. SHA384.hash(data:)

الوصف: مشابه لـ SHA256، لكنه يستخدم ملخصًا (digest) بحجم 384 بت. أكثر أمانًا لكنه أبطأ.

المعاملات: نفس معاملات SHA256.

مثال:

let digest384 = SHA384.hash(data: data)
print(digest384)

3. SHA512.hash(data:)

الوصف: يستخدم ملخصًا بحجم 512 بت، وهو الأكثر أمانًا بين خوارزميات SHA-2.

المعاملات: نفس ما سبق.

مثال:

let digest512 = SHA512.hash(data: data)
print(digest512)

4. AES.GCM.seal(_:using:nonce:)

الوصف: يقوم بتشفير البيانات باستخدام خوارزمية AES-GCM (تشفير متماثل مع مصادقة). يُرجع كائن AES.GCM.SealedBox.

المعاملات:

  • plaintext: Data — النص الواضح المراد تشفيره.
  • using: SymmetricKey — المفتاح السري (256 بت).
  • nonce: AES.GCM.Nonce? — قيمة عشوائية اختيارية (إذا لم تُمرر، يتم توليدها تلقائيًا).

مثال:

let key = SymmetricKey(size: .bits256)
let sealedBox = try AES.GCM.seal(plaintext, using: key)
print(sealedBox.ciphertext.base64EncodedString())

5. AES.GCM.open(_:using:)

الوصف: يفك تشفير البيانات المُغلقة (SealedBox) التي تم تشفيرها باستخدام AES-GCM. يتحقق من سلامة البيانات والمصادقة.

المعاملات:

  • sealedBox: AES.GCM.SealedBox — الصندوق المُغلق الذي يحتوي على البيانات المشفرة.
  • using: SymmetricKey — نفس المفتاح المستخدم في التشفير.

مثال:

let decryptedData = try AES.GCM.open(sealedBox, using: key)

6. ChaChaPoly.seal(_:using:)

الوصف: تشفير باستخدام خوارزمية ChaCha20-Poly1305، وهي بديل سريع وآمن لـ AES-GCM، خاصة على الأجهزة المحمولة.

المعاملات: مشابهة لـ AES.GCM.seal.

مثال:

let chachaBox = try ChaChaPoly.seal(plaintext, using: key)

7. Curve25519.KeyAgreement

الوصف: يُستخدم لإنشاء اتفاقية مفتاح مشترك (Shared Secret) باستخدام منحنى Curve25519 (X25519). مثالي لبروتوكولات تبادل المفاتيح.

المعاملات:

  • إنشاء مفتاح خاص: let privateKey = Curve25519.KeyAgreement.PrivateKey()
  • استخراج المفتاح العام: let publicKey = privateKey.publicKey

مثال:

let alicePrivateKey = Curve25519.KeyAgreement.PrivateKey()
let bobPrivateKey = Curve25519.KeyAgreement.PrivateKey()
let sharedSecretAlice = try alicePrivateKey.sharedSecretFromKeyAgreement(with: bobPrivateKey.publicKey)
let sharedSecretBob = try bobPrivateKey.sharedSecretFromKeyAgreement(with: alicePrivateKey.publicKey)
// sharedSecretAlice == sharedSecretBob

8. P256.Signing.PrivateKey

الوصف: يُستخدم للتوقيع الرقمي باستخدام منحنى P-256 (ECDSA). يُنشئ زوج مفاتيح خاص وعام.

المعاملات:

  • إنشاء مفتاح خاص: let privateKey = P256.Signing.PrivateKey()
  • التوقيع: let signature = try privateKey.signature(for: data)

مثال:

let signingKey = P256.Signing.PrivateKey()
let signature = try signingKey.signature(for: data)
let isVerified = signingKey.publicKey.isValidSignature(signature, for: data)

9. SecureRandomNumberGenerator

الوصف: مولد أرقام عشوائية آمن تشفيريًا. يُستخدم لإنشاء مفاتيح أو nonces.

المعاملات: لا معاملات مباشرة، يُستخدم عبر SymmetricKey(size: .bits256).

مثال:

let randomKey = SymmetricKey(size: .bits256) // يستخدم SecureRandomNumberGenerator داخليًا

10. HashFunction (بروتوكول)

الوصف: بروتوكول عام لوظائف التجزئة. يمكنك استخدامه لكتابة دوال عامة تعمل مع أي خوارزمية تجزئة (SHA256, SHA384, SHA512).

المعاملات: يعمل مع أي نوع يتبع البروتوكول.

مثال:

func computeHash<H: HashFunction>(using hashFunction: H.Type, data: Data) -> H.Digest {
    return hashFunction.hash(data: data)
}
let hash = computeHash(using: SHA256.self, data: data)

الخلاصة

CryptoKit هو أداة قوية وسهلة الاستخدام لتأمين تطبيقات Apple. بفضل تكامله العميق مع النظام، يمكنك تنفيذ تشفير قوي، تجزئة، وتوقيعات رقمية بأسطر قليلة من الكود. ابدأ باستخدامه اليوم لتعزيز أمان تطبيقاتك!

توصيات