【Flutter】APP的数据安全(基于Flutter 交易所APP的总结)
【Flutter】APP的数据安全(基于Flutter 交易所APP的总结)
一、前言
我在区块链行业工作,所以APP的安全性对于互联网金融类型的APP,安全性非常重要;我所在的交易所APP都是Flutter开发的,所以我这里面的讲解都是基于Flutter 项目的;
在Flutter项目中,“数据安全” 涉及多个层面:本地存储安全、网络通信安全、运行时防护、敏感信息保护 等,下面我将分层讲清楚每个环节的安全策略和实战建议。
🔥🔥🔥 👇🏻👇🏻👇🏻更多Web3/钱包相关的可以看我之前的文章👇🏻👇🏻👇🏻 🔥🔥🔥
- 👉🏻 【WEB3】WEB3钱包APP框架的设计
- 👉🏻 【WEB3】钱包助记词在APP中的加密存储
二、总体安全思路
APP数据安全可以分为 4 个主要方向:
安全层级 | 目标 | 技术方案 |
---|---|---|
本地数据安全 | 防止被逆向或读取用户隐私 | 数据加密、SQLCipher、本地加密文件、Keychain/Keystore |
通信安全 | 防止中间人攻击、数据篡改 | HTTPS + SSL Pinning + 签名验证 |
代码与运行时安全 | 防止反编译、调试、Hook | 混淆、检测Root/越狱、反调试、反注入 |
逻辑与接口安全 | 防止伪造请求、绕过验证 | Token签名、时间戳+Nonce+签名机制、服务端验证 |
三、本地数据安全
1. 使用加密数据库
我在项目中使用了 sqflite_sqlcipher
,这种数据库是加密版 SQLite,内部使用 AES-256 加密算法,能有效防止数据库文件被直接打开。
final db = await openDatabase('secure.db',password: 'hardcoded_password', // 建议改为动态密钥
);
改进建议:
- 密码不要硬编码,使用混淆或异或加密存储。
- 可结合 Keychain(iOS)或 Keystore(Android)存储数据库密钥。
2. 使用 Keychain / Keystore 安全存储
使用 flutter_secure_storage
:
- Android:基于 Keystore
- iOS:基于 Keychain
示例:
final secureStorage = const FlutterSecureStorage();
await secureStorage.write(key: 'user_token', value: encryptedToken);
安全优势:
- 系统级沙盒保护
- 即使被 Root 或越狱,也更难提取明文
3. 敏感文件加密存储
若有下载文件或缓存涉及隐私(如钱包助记词、用户资料):
- 使用
encrypt
包对文件内容进行 AES 加密 - 存储时再写入
appDocDir/secure/
路径 - 避免放入
/tmp
或可被共享的路径
四、网络通信安全
1. 强制使用 HTTPS
所有接口必须使用 HTTPS,拒绝明文 HTTP 请求。
在 Dio 中可以统一配置:
(dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate = (client) {client.badCertificateCallback = (cert, host, port) => false; // 禁止忽略SSLreturn client;
};
2. 启用 SSL Pinning(证书绑定)
可以防止中间人攻击,即使安装伪造证书也无法拦截请求。
使用 dio_smart_ssl_pinning
或自己配置:
final client = HttpClient()..badCertificateCallback = (cert, host, port) {final pem = cert.pem;return pem == yourPinnedCertPem; // 比对固定证书};
3. 请求签名 + 防重放
为每个请求增加:
- 时间戳
timestamp
- 随机数
nonce
- HMAC-SHA256 签名
sign = HMAC(secretKey, timestamp+nonce+body)
服务端验证签名和时间窗口,有效防止伪造请求。
五、代码与运行时安全
1. Flutter 混淆
在 android/app/proguard-rules.pro
中启用混淆:
# 保留必要的类
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
在 build.gradle
中:
buildTypes {release {minifyEnabled trueshrinkResources true}
}
iOS 端自动有 bitcode 优化,不需要特别处理。
2. 检测 Root / 越狱
使用 flutter_jailbreak_detection
:
final isJailBroken = await FlutterJailbreakDetection.jailbroken;
检测到后可提示“当前设备不安全,功能受限”。
3. 运行时保护
可加入以下防护逻辑:
- 检测调试模式(
kDebugMode
) - 检测动态注入(如
Frida
,Xposed
) - 检测屏幕录制、ADB、代理网络
六、Web3 / 钱包项目特别安全建议
1. 助记词/私钥:
- 永远不存明文,使用 AES + Keychain 双层加密。
- 仅在内存中短暂解密使用后立即清除。
2. 钱包解锁逻辑:
- 使用生物识别(FaceID / 指纹)验证。
- 配合 Gesture 解锁或 PIN 验证。
3. 网络签名:
- 交易签名在本地完成,不上传私钥。
- 使用硬件签名(如 Secure Enclave)更安全。
🔥🔥🔥 👇🏻👇🏻👇🏻更多Web3/钱包相关的可以看我之前的文章👇🏻👇🏻👇🏻 🔥🔥🔥
- 👉🏻 【WEB3】WEB3钱包APP框架的设计
- 👉🏻 【WEB3】钱包助记词在APP中的加密存储
七、安全检测建议
上线前可做以下检测:
- 👉🏻 使用 MobSF / AppScan 做静态扫描(检查敏感信息泄露)
- 👉🏻 使用 OWASP MASVS 作为移动安全基线检查表
- 👉🏻 使用 obfuscator-llvm(iOS原生层)增加逆向难度
八、总结:Flutter APP 安全清单
分类 | 建议 |
---|---|
本地存储 | sqflite_sqlcipher + flutter_secure_storage |
通信安全 | HTTPS + SSL Pinning + 签名验证 |
代码安全 | 混淆、反调试、检测Root |
敏感逻辑 | 本地签名、Keychain保存密钥 |
Web3 特殊 | 助记词AES加密、本地签名交易 |
安全检测 | OWASP、MobSF、手动穿透测试 |
九、Flutter 安全配置模板项目结构
lib/
├── main.dart
├── core/
│ ├── security/
│ │ ├── secure_storage.dart # Keychain/Keystore 封装
│ │ ├── secure_db.dart # SQLCipher 加密数据库封装
│ │ ├── encryption_util.dart # AES 加密工具
│ │ ├── ssl_pinning_client.dart # SSL Pinning 网络安全
│ │ ├── security_guard.dart # Root/调试检测、防Hook
│ └── network/
│ └── dio_client.dart # Dio 封装(签名、拦截器)
│
├── features/
│ ├── auth/
│ │ ├── lock_page.dart # 手势 / PIN 解锁页面
│ │ └── biometrics_service.dart # 生物识别登录
│ └── wallet/
│ ├── wallet_manager.dart # 助记词 / 私钥管理
│ └── wallet_service.dart # 钱包业务接口
│
└── utils/├── logger.dart└── device_info_util.dart
十、关于作者(ZFJ_张福杰)
- 官网:https://zfjsafe.com
- 博客:https://zfj1128.blog.csdn.net
- Github:https://github.com/zfjsyqk
- Gitee:https://gitee.com/zfj1128
- 打赏:https://zfjsafe.com/paycode