جميع حزم المصدر المفتوح
الأدواتSwift

iOSSecurityTools

Keychain، التشفير، الـ pinning، الأكواد لمرة واحدة وفحوصات التكامل لتطبيقات Apple.

5النجومآخر إصدار: v2.1.0 · آخر تحديث: 21 أكتوبر 2026
الأنظمة الأساسية:iOS 17macOS 14tvOS 17watchOS 10visionOS 1

الترخيص: MIT

الاختبارات: 589تاريخ القياس:

طريقة القياس

swift test at PR #25 head 5b71c19 (the planned v2.1.0, not yet tagged) on macOS 27.0.1, Apple Swift 6.4: "Test run with 589 tests in 101 suites passed after 370.336 seconds". Re-run at the v2.1.0 tag before publishing.

ملخص

  • حزمة Swift بلا اعتماديات تضم لبنات keychain والتشفير وSecure Enclave وpinning وكلمة المرور لمرة واحدة والتكامل وredaction السجلات لخمس منصات Apple.
  • كان يمكن تجاوز log redactor في 2.0.0 بحروف شبيهة وescapes وأسماء سرية مكتوبة كقيم، لذا لا ينبغي الاعتماد على 2.0.0 للسجلات.
  • في 2.1.0 تُقارَن بالأسماء السرية المفاتيح ذات ASCII الصرف فقط، وتُخفى افتراضيًا قيمة أي مفتاح آخر.
  • تُقرأ أجسام JSON وform وmultipart بمحلِّلات، ويُحذف أي جسم لا يُحلَّل بالكامل أو يتجاوز 256 KiB.
  • redaction شبكة أمان ضد أسرار تُسجَّل بالخطأ، وليست ضمانًا ضد من يموّه سرًا عمدًا.

حزمة Swift من لبنات الأمان الأساسية لتطبيقات iOS وmacOS وtvOS وwatchOS وvisionOS: التخزين في keychain، التشفير الموثّق (authenticated encryption)، تجزئات (hashes) PIN، مفاتيح Secure Enclave، تثبيت الشهادات (certificate pinning)، كلمات مرور لمرة واحدة، فحوصات تكامل الجهاز، وredaction السجلات. كل نوع يتحقق مما يُعطى له ويطرح خطأً من نوع typed بدلاً من الانهيار، فلا يمكن لقيمة قادمة من رمز QR أو خادم أو ملف أن تُوقِع التطبيق في فخّ. يستدعي أطر عمل Apple مباشرة وليس له أي اعتماديات.

الميزات

  • Keychain يخزّن data وstrings وقيم Codable، وينشئ مفتاحًا من 256 بت عند أول استخدام، ويمكنه اشتراط Face ID أو Touch ID أو رمز المرور، وهو شرط يفرضه keychain نفسه
  • DataCipher يكتب أظرفة (envelopes) AES-256-GCM أو ChaCha20-Poly1305 تحمل إصدارها وخوارزميتها وnonce الخاص بها؛ أي byte تغيّر أو مفتاح خاطئ أو associated data خاطئة يُفشل فك التشفير
  • HKDF وPBKDF2 وتجزئات PIN بصيغة PHC، بعدد تكرارات محدود بسقف حتى لا يجعل hash مُتلاعب به عملية التحقق تستغرق ساعات
  • PinningPolicy يشترط pin احتياطيًا، ويدعم النطاقات الفرعية (subdomains) وتواريخ انتهاء الصلاحية ووضع report-only، ولا يزال يشترط نجاح تقييم الثقة الخاص بالنظام نفسه
  • HOTP وTOTP بتحليل وكتابة otpauth://، ومفاتيح Secure Enclave من نوع P-256 لربط حساب بالجهاز
  • IntegrityInspector يُبلغ عن ملفات jailbreak وdebugger والمحاكي (simulator) ومكتبات hooking وproxy النظام كإشارات في تقرير Codable، لا كدليل
  • SensitiveDataRedactor يقارن فقط المفاتيح ذات ASCII الصرف بأسمائه السرية ويخفي قيمة كل مفتاح آخر؛ تُقرأ أجسام (bodies) JSON وform وmultipart وعناوين URL بمحلِّلات (parsers)، وما لا يمكن تحليله يُحذف
  • @Redacted يطبع <redacted> في الأوصاف (descriptions)، وتغطي .privacyShield() العروض في app switcher وأثناء تسجيل الشاشة

البدء السريع

swift
1import SwiftUI
2import iOSSecurityTools
3 
4struct ContentView: View {
5 @State private var status = "Nothing stored yet"
6 
7 var body: some View {
8 VStack(spacing: 16) {
9 Text(status)
10 Button("Encrypt and store a note") {
11 do {
12 let keychain = Keychain(service: "QuickStart")
13 let cipher = try DataCipher(key: keychain.symmetricKey(forKey: "notes-key"))
14 try keychain.set(cipher.encrypt("Meet at 7 pm"), forKey: "note")
15 
16 let stored = try keychain.data(forKey: "note") ?? Data()
17 status = "Decrypted: \(try cipher.decryptString(stored))"
18 } catch {
19 status = error.localizedDescription
20 }
21 }
22 .buttonStyle(.borderedProminent)
23 }
24 .padding()
25 .privacyShield()
26 }
27}

التثبيت

Swift Package Manager

swift
1dependencies: [
2 .package(url: "https://github.com/muhittincamdali/iOSSecurityTools.git", from: "2.1.0")
3],
4targets: [
5 .target(name: "YourApp", dependencies: [
6 .product(name: "iOSSecurityTools", package: "iOSSecurityTools")
7 ])
8]

Xcode

text
1https://github.com/muhittincamdali/iOSSecurityTools.git

لقطات الشاشة

نص سجل (log) يحتوي بريدًا إلكترونيًا وكلمة مرور وbearer token ورقم بطاقة، والنسخة المُخفاة (redacted) أسفله
نص سجل (log) يحتوي بريدًا إلكترونيًا وكلمة مرور وbearer token ورقم بطاقة، والنسخة المُخفاة (redacted) أسفله، بالوضع الداكن (dark mode)
ملاحظة مشفّرة في keychain بحجم 46 بايت وتُقرأ مجددًا، وPIN يُفحص مقابل hash المخزّن له
تقرير التكامل (integrity) في المحاكي: فحص jailbreak غير قابل للتطبيق، تم العثور على المحاكي؛ debugger ومكتبات مُحقَنة وproxy سليمة
كود TOTP من ستة أرقام من otpauth URI مع حلقة تَعُدّ تنازليًا الثواني المتبقية
عرض لتفاصيل بطاقة مغطّى بـ privacy shield برمز قفل

الجدول الزمني

  1. افتُتح المستودع بمساعدات تشفير AES وRSA

  2. صدر الإصدار v1.0.0، وكان قاعدة كود مختلفة عن الحزمة الحالية

  3. تنظيف: استُبدلت مصادر 1.0.0 بكود placeholder

  4. أُعيد البناء من الصفر كـ 2.0.0: keychain، تشفير، مفاتيح Secure Enclave، القياسات الحيوية (biometrics)، pinning، كلمات مرور لمرة واحدة، فحوصات تكامل وredaction السجلات؛ ولم يُبقَ على أي شيء من 1.0.0 API

  5. 2.1.0: أُعيد تصميم log redactor بعد أن تبيّن أن 2.0.0 قابل للتجاوز؛ المفاتيح التي ليست ASCII صرفة تُخفى افتراضيًا، وتُقرأ الأجسام (bodies) وعناوين URL بمحلِّلات (parsers)

الروابط

مقالة ذات صلة

قراءة المقالة