Không có cách chặn tuyệt đối: file APK/IPA nằm trên máy người dùng nên luôn bị giải nén và phân tích được. Mục tiêu thực tế là tăng chi phí tấn công và không để lộ gì quan trọng nếu bị dịch ngược.
1. Không đặt bí mật trong app. API secret, khoá ký, logic tính tiền phải ở server. Đây là lớp quan trọng nhất.
2. Obfuscation — đổi tên class/hàm thành ký hiệu vô nghĩa:
flutter build appbundle --obfuscate --split-debug-info=build/symbolsPhần Kotlin/Java do R8 xử lý (isMinifyEnabled = true). Obfuscation không mã hoá resource, không che tên enum, và làm hỏng code dựa vào runtimeType.toString(). Nhớ lưu thư mục symbols để giải mã stack trace khi crash.
3. Kiểm tra tính toàn vẹn — app có bị sửa, máy có bị root/jailbreak không:
- Android: Play Integrity API trả verdict (app gốc từ Play, thiết bị đạt chuẩn). Verdict phải được giải mã và kiểm tra ở server, kèm nonce chống replay — kiểm tra phía client thì chính nó cũng bị patch được.
- iOS: App Attest (DeviceCheck).
- Phát hiện root/jailbreak, debugger, hooking (Frida) bằng thư viện RASP.
4. Bảo vệ đường truyền — HTTPS, certificate pinning cho app tài chính.
OWASP MASVS-RESILIENCE gọi các biện pháp này là defense-in-depth: chúng bổ sung, không thay thế kiến trúc bảo mật đúng.
Lưu ý: phát hiện root quá gắt dễ chặn nhầm người dùng hợp lệ (ROM tuỳ biến); với app ngân hàng thường chặn thao tác nhạy cảm thay vì chặn cả app.