CentOS 上构建与运行 Flutter 的安全加固清单
一 构建环境安全
- 使用受支持的 Dart/Flutter 版本:自 Dart 3.0(2023-05) 起默认启用健全的空安全,且 Flutter 3.10.0+ 依赖 Dart 3.0。旧项目应完成空安全迁移,避免使用已弃用的运行参数(如 --no-sound-null-safety)。升级与迁移建议:flutter pub outdated --mode=null-safety、按依赖图自底向上升级、必要时按文件逐步迁移并回归测试。
- 最小化与加固 CI 运行器:在 CentOS 上部署 Jenkins/GitHub Actions 等 CI 时,将 Flutter SDK 与 Android SDK 安装在受限目录(如 /opt/flutter、/opt/android-sdk),以专用 CI 用户运行,开启最小权限与系统加固(SELinux/防火墙/日志审计),并隔离构建节点网络访问。
- 依赖与漏洞治理:定期执行 flutter pub deps 清理未使用依赖;启用 Dependabot/Snyk/GitHub 安全警报 监控 CVE;锁定版本并保留变更记录,避免供应链风险。
二 代码与密钥管理
- 禁止硬编码密钥:不在代码或仓库中存放 API Key、服务账号 JSON、OAuth 密钥。构建时通过 CI Secrets 注入;运行时使用 flutter_secure_storage(iOS Keychain / Android Keystore)保存令牌与敏感数据,退出登录或长时间不活动即清除。
- 安全的配置分发:优先采用 环境变量/flutter_dotenv 管理非高度敏感配置;对高度敏感或需动态变更的配置,使用 HTTPS 拉取 或 Firebase Remote Config,并设定最小获取间隔与超时、回退默认值。
- 令牌与身份认证:使用 OAuth2/JWT 等短生命周期令牌,放入 Authorization: Bearer 请求头;在 401 场景按策略刷新令牌并限制刷新次数;服务端进行令牌校验与权限判定,避免仅依赖客户端检查。
三 网络通信与本地存储
- 全链路加密与证书锁定:所有请求强制 HTTPS;对认证、支付等敏感接口实施 证书锁定(certificate pinning),并制定 CA 证书轮换 与异常回退方案,降低 MITM 风险。
- 本地数据最小化与加密:不在 SharedPreferences/明文文件 中存放 PII、密码、长期令牌;敏感数据库启用加密或避免落地;对缓存设置生命周期与清退策略,用户登出即清理。
- 权限最小化:仅申请必要权限,移除 AndroidManifest.xml / Info.plist 中未使用的权限;在合适的业务时机解释权限用途,降低攻击面与用户抵触。
四 发布加固与运行时防护
- 发布包混淆与调试信息剥离:Android 使用 R8/ProGuard(minifyEnabled、shrinkResources),Flutter 启用 –obfuscate --split-debug-info=./debug-info;iOS 发布时去除调试符号,减少逆向可读性与信息泄露。
- 原生层与 MethodChannel 安全:将密钥派生、加解密、风控等敏感逻辑下沉至 Android Keystore/iOS Keychain 保护;对 MethodChannel 名称、参数与回调进行最小化暴露与校验,防止被 Hook 伪造。
- 运行环境风控:增加 Root/越狱检测 与模拟器检测,发现高风险环境可限制敏感功能或触发上报;对关键操作引入 服务端二次校验 与 功能开关/分阶段发布,降低单点失效影响。
五 快速落地命令与配置示例
- 版本与依赖治理
- 升级与空安全检查:flutter upgrade;flutter pub outdated --mode=null-safety
- 依赖清理:flutter pub deps;移除未使用包并更新锁文件
- 构建与混淆(Android 示例)
- 发布构建:flutter build appbundle --release --obfuscate --split-debug-info=./debug-info
- Android 混淆:在 android/app/build.gradle 启用 R8/ProGuard
- 密钥注入与读取(示例)
- 构建时注入:GitHub Actions Secrets / Jenkins Credentials → 环境变量
- Dart 读取:使用 dart:io 读取环境变量或使用 flutter_dotenv 加载 .env
- 证书锁定(Dio 示例)
- 在 Dio 的 HttpClientAdapter 中设置证书校验回调,比对 SHA-256 指纹,不匹配则拒绝连接(上线前在测试环境充分验证证书轮换场景)