تكرار السؤال: …
الإجابة المختصرة
خزّن الرموز والأسرار في Keychain/Keystore عبر flutter_secure_storage وليس في SharedPreferences، ثبّت شهادة الخادم أو مفتاحها العام لمنع هجمات الوسيط، وفعّل obfuscate مع split-debug-info، ولا تضع أسرارًا حقيقية داخل التطبيق لأنه قابل للفك.
الشرح
يُشفَّر ما يُحفظ عبر flutter_secure_storage بمفاتيح يحميها نظام التشغيل (Keychain على iOS و Keystore على Android). تثبيت الشهادة (Certificate/Public-key Pinning) يجعل التطبيق يرفض أي شهادة غير متوقعة حتى لو وقّعتها جهة موثوقة، لكنه يتطلب خطة لتدوير الشهادات. يصعّب التشويش (obfuscation) قراءة أسماء الدوال في الكود المترجم لكنه لا يخفي النصوص أو الأسرار؛ لذلك لا تُضمّن مفاتيح API سرية في التطبيق وانقل التعامل معها إلى خادم وسيط. وللتحقق من سلامة الجهاز والتطبيق استخدم Play Integrity و App Attest.
مثال بالكود
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
const storage = FlutterSecureStorage(
aOptions: AndroidOptions(encryptedSharedPreferences: true),
);
Future<void> saveToken(String token) => storage.write(key: 'refresh_token', value: token);
// Pinning: trust ONLY our own CA/certificate instead of the system trust store
Future<HttpClient> pinnedClient() async {
final pem = (await rootBundle.load('assets/certs/api_ca.pem')).buffer.asUint8List();
final context = SecurityContext(withTrustedRoots: false)..setTrustedCertificatesBytes(pem);
return HttpClient(context: context); // handshakes with any other certificate fail
}
// Build with obfuscation (keep build/symbols to de-obfuscate crash reports):
// flutter build appbundle --obfuscate --split-debug-info=build/symbolsأخطاء شائعة
- تخزين access token أو كلمات المرور في SharedPreferences بنص صريح.
- تضمين مفاتيح API السرية داخل الكود معتمدًا على obfuscation لإخفائها.