الفصل الحادي عشر: الأمان والخصوصية Chapter 11: Security & Bio-Auth

حماية بيانات المستخدمين هي أولويتنا القصوى في MRE CashBook.

🛡️ استراتيجية الأمان الشاملة The Layered Security Strategy

بما إن التطبيق بيتعامل مع بيانات مالية حساسة، كان لازم نوفر طبقتين من الحماية:

1
Access Layer (حماية الوصول)

منع أي حد يفتح التطبيق غير صاحب الموبايل عن طريق البصمة أو الـ PIN.

2
Storage Layer (حماية البيانات)

تأمين قواعد البيانات والنسخ الاحتياطية من التلاعب عن طريق التشفير.

🚧 بوابة الدخول: AuthGuardScreen The Gatekeeper UI

التطبيق مش بيفتح مباشرة لو المستخدم مفعل "قفل التطبيق". بيظهر شاشة حماية بتطلب البصمة الأول.

graph TD Start[App Launch] --> Check{Lock Enabled?} Check -- No --> Home[Main Screen] Check -- Yes --> Auth[AuthGuardScreen] Auth --> Try{Authenticate} Try -- Success --> Home Try -- Fail --> Auth
auth_guard_screen.dart
Future _authenticate() async {
  final success = await context.read().authenticate();
  if (success) {
    Navigator.of(context).pushReplacement(
      MaterialPageRoute(builder: (_) => const MainScreen()),
    );
  }
}
pushReplacement
ليش التبديل؟Why Replace?
عشان المستخدم ما يقدرش يعمل "Back" ويرجع لشاشة القفل بعد ما دخل التطبيق. ده أمان في المسار (Navigation Flow).So the user cannot navigate "Back" to the lock screen after successfully entering the app. Security in flow.
🧬 منطق البصمة: local_auth Deep Dive: local_auth Implementation

بنستخدم باقة local_auth اللي بتتعامل مع حساسات الموبايل بشكل آمن.

app_settings_cubit.dart
final bool canAuth = await _auth.canCheckBiometrics || 
                     await _auth.isDeviceSupported();

final bool didAuthenticate = await _auth.authenticate(
  localizedReason: 'authenticate_to_unlock_app'.tr(),
  options: const AuthenticationOptions(
    stickyAuth: true,
    biometricOnly: true,
  ),
);
🩹 استمرار الجلسة: Sticky Auth Session Resilience: Sticky Auth

خاصية stickyAuth مهمة جداً لراحة المستخدم:

لو المستخدم جالوا اتصال وخرج من التطبيق ورجع في ثواني، التطبيق مش هيطلب البصمة تاني فوراً وهيفضل فاكر الجلسة، وده بيمنع الإزعاج.

🔐 تشفير البيانات: AES Encryption Cryptographic Layer: AES

النسخ الاحتياطي (Backup) بيحتوي على كل أرقامك. بنستخدم معيار AES-256 لتشفير الداتا.

final key = Key.fromUtf8('32_chars_long_secure_key_!!!!');
final iv = IV.fromLength(16);
final encrypter = Encrypter(AES(key));

final encrypted = encrypter.encrypt(jsonData, iv: iv);
📁 أمن ملفات النسخ الاحتياطي Security of Backup Files

الملف اللي المستخدم بيحفظه مش مجرد نص، هو ملف مشفر تماماً (Encrypted Binary). لو حاولت تفتحه في Notepad هتلاقي رموز غير مفهومة.

مفتاح التشفير: في MRE CashBook بنستخدم مفتاح ثابت مدمج في الكود، وده بيسمح ليك تسترجع بياناتك حتى لو غيرت الموبايل.

📲 إعدادات النظام (System Config) OS-Level Permissions

الأمان مش كود بس، لازم نعرف النظام إننا هنستخدم الحساسات.

🍎 إعدادات iOS (FaceID) iOS FaceID Configuration

في ملف Info.plist، لازم نضيف الرسالة اللي هتظهر للمستخدم لما نطلب الـ FaceID:

<key>NSFaceIDUsageDescription</key>
<string>نحتاج للوصول للـ FaceID لتأمين بياناتك المالية.</string>
🤖 إعدادات Android (Fingerprint) Android Fingerprint Config

في ملف AndroidManifest.xml، لازم نضيف التصريح:

<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
🛠️ حل المشاكل الأمنية Troubleshooting Security Issues
1
Biometrics not showing

السبب: المستخدم مش مسجل بصمة في إعدادات الموبايل.

الحل: وجه المستخدم لإعدادات النظام يضيف بصمة الأول.

2
Encryption Key Loss

السبب: لو غيرت الـ Key في تحديث جديد، كل النسخ القديمة مش هتفتح.

أسئلة شائعة في الأمان Security FAQ
هل التطبيق بيحفظ بصمتي في الداتابيز؟
Does the app store my fingerprint?
طبعاً لأ. التطبيق بيطلب من نظام التشغيل (Android/iOS) التأكد من البصمة، والنظام بيرد علينا بـ "صح" أو "غلط" فقط. بصمتك بتفضل في مكان مشفر داخل الموبايل نفسه.
Absolutely not. The app asks the OS to verify, and the OS returns only a success/failure result. Your biometric data stays in the OS's secure enclave.
📖 قاموس الأمان Security Glossary
TermMeaning (AR)
AESمعيار تشفير كُتلي متقدم بيستخدم في حماية البيانات الحساسة.
IV (Initialization Vector)رقم عشوائي بيستخدم في بداية التشفير عشان يمنع الأنماط المتكررة.
Safe Enclaveمنطقة في المعالج مخصصة لحفظ البيانات الحساسة زي البصمات.
🔑 إدارة مفاتيح التشفير Code Logic: AES Key Management

التشفير مش بس encrypt، هو إدارة ذكية للمفاتيح. في MRE CashBook بنتبع الاستراتيجية دي:

1
32-Byte Key

الـ AES-256 بيطلب مفتاح طوله 32 حرف. إحنا بنستخدم Key.fromUtf8 عشان نتأكد إن المفتاح متوافق مع المعايير العالمية.

2
Deterministic IV

في عمليات الـ Backup، بنستخدم IV.fromLength(16) لضمان استقرار عملية التشفير وفك التشفير بين الأجهزة المختلفة.

🤝 المصافحة الأمنية (The Handshake) The Security Handshake Flow

إيه اللي بيحصل بالظبط لما تدوس "Unlock"؟

Auth Handshake
1. UI
المستخدم بيدوس على زرار البصمة.User taps the fingerprint button.
2. Cubit
الـ Cubit بيطلب من LocalAuthentication البدء.Cubit requests `LocalAuthentication` to start.
3. OS
نظام التشغيل بيظهر مربع حوار البصمة الأصلي الخاص بالموبايل.OS displays the native biometric dialog.
4. Callback
النظام بيرد بالنتيجة، والـ Cubit بيغير الـ State لـ success.OS returns the result, and Cubit updates State to `success`.
⚙️ خيارات التحقق المتقدمة Advanced Local Auth Options
OptionMeaning (AR)Benefit
stickyAuthاستمرار التحقق لو التطبيق نزل في الخلفية.UX Smoothness
biometricOnlyإلزام البصمة فقط (بدون الـ PIN).Strict Security
useErrorDialogsإظهار رسائل خطأ النظام تلقائياً.System Consistency
📝 اختبر معلوماتك الأمنية Security Knowledge Check
ماذا يحدث لو فقد المستخدم الـ Secret Key الخاص بالنسخ الاحتياطي؟
لن يتمكن من استعادة بياناته أبداً، لأن التشفير باتجاه واحد بدون المفتاح الصحيح.
هل يمكن تخطي شاشة الحماية عن طريق زر "Back"؟
لا، لأننا نستخدم pushReplacement التي تحذف شاشة القفل من ذاكرة التنقل.
⚠️ معالجة أخطاء المصادقة Auth Error Handling

مش دايماً البصمة بتشتغل من أول مرة. إحنا بنهندل الحالات دي في الكود:

try {
  final authenticated = await _auth.authenticate(...);
  // success logic
} on PlatformException catch (e) {
  if (e.code == auth_error.notAvailable) {
    // البصمة مش مدعومة أو مش مفعلة
  } else if (e.code == auth_error.lockedOut) {
    // المستخدم حاول كتير غلط والجهاز قفل
  }
}
📊 جدول طبقات الأمان التفصيلي Detailed Security Layers
LayerToolProtection Against
Front GateAuthGuardScreenPhysical unauthorized access.
Data Storageencrypt (AES-256)File theft / Data leakage.
Memoryget_it (Singletons)Memory corruption / Inconsistent states.
TransportFirebase MessagingTampered notifications.
👑 نصائح المحترفين في الأمان Security Pro Tips
TIP
Dynamic Keys

في التطبيقات الأكثر تعقيداً، يفضل استخدام flutter_secure_storage لحفظ الـ Secret Key بشكل ديناميكي لكل جهاز، بدل ما يكون Hardcoded.

TIP
Obfuscation

دايماً نشغل الـ --obfuscate وقت الـ build عشان نصعب عملية الـ Reverse Engineering للتطبيق.

📝 ملخص الفصل Chapter Summary
FeatureImplementation ToolSecurity Level
App Locklocal_authHigh (Biometric)
Data Backupencrypt (AES)Very High
Auth GateAuthGuardScreenMedium (Flow Control)

بكدة نكون ضمنا إن MRE CashBook مش بس تطبيق مفيد، لكنه حصن حصين لبيانات المستخدمين.