FlutterDefend

FlutterDefend 是一个轻量级、模块化、可插拔的 Flutter 移动端安全工具 SDK,专为保护移动应用中的关键操作和数据设计。它提供了用于防御常见攻击和提升安全性的能力,例如 SQL 注入检测、本地加密存储、防截图输入字段封装,以及越狱/root 设备检测。

适用于中大型应用的安全基线,也适用于对隐私和安全有基本需求的中小应用。


✨ 功能特性

  • 🔐 本地加密存储(使用凯撒密码,基于实例密钥)
  • 🛡️ SQL 注入检测(运行时输入内容分析)
  • 🖊️ 安全输入封装组件(禁止粘贴、禁止截图、自带校验器)
  • 📱 越狱/Root 检测(基于原生接口)
  • 📦 统一 SDK 门面类:FlutterDefend

🔧 安装方式

pubspec.yaml 中添加依赖:

dependencies:
  flutter_defend:
    git:
      url: https://github.com/ctkqiang/flutter_defend.git

dependencies:
  flutter_defend:
    git:
      url: https://gitcode.com/ctkqiang_sr/flutter_defend.git

或发布至 pub.flutter-io.cn 后使用:

dependencies:
  flutter_defend: ^0.1.0

然后执行:

flutter pub get

🧠 SDK 组件说明

1. SecuredStorage

封装后的本地加密 Key-Value 存储。

核心逻辑:

  • 每个实例基于传入的 passphrase 推导加密偏移量(即位移)
  • 可选一方向加密模式(类似哈希,不能解密)
  • 借助 FlutterSecureStorage 进行数据落地存储

示例:

final storage = FlutterDefend.secureStorage;
await storage.write("token", "my-secret-token");
final token = await storage.read("token");

使用动态密钥:

final userStorage = FlutterDefend.withPassphrase("user-session-token");
await userStorage.write("email", "alice@example.com");

2. SQLInjection

简单的 SQL 注入字符串关键字检测模块。

使用方式:

final input = "SELECT * FROM users";
if (FlutterDefend.sqlInjection.containsInjection(input)) {
  throw Exception("检测到潜在 SQL 注入风险。");
}

实现原理:

  • 将输入转小写
  • 使用关键词匹配,如 selectdropor 1=1--
  • 返回布尔值判断结果

3. SecureInput

封装 TextField 组件,提供以下保护:

  • 自动防止 SQL 注入输入
  • 可选禁止粘贴、长按复制
  • 可选屏蔽截图(Android / iOS)

示例:

final inputField = FlutterDefend.secureInput.wrapTextField(
  TextField(
    controller: myController,
    obscureText: true,
    decoration: InputDecoration(labelText: "密码"),
  ),
);

可选参数:

  • preventPaste: true 禁止粘贴
  • preventScreenshot: true 禁止截图录屏
  • validator 自定义校验逻辑(默认为 SQL 注入检查)

4. Jailbreak

检测设备是否越狱(iOS)或 Root(Android)。

示例:

final compromised = await FlutterDefend.jailbreak.isDeviceCompromised();
if (compromised) {
  // 采取阻断、上报等措施
}

实现原理:

  • 基于 flutter_root_jailbreak 插件
  • 原生调用系统文件路径、权限、二进制检测等
  • 返回布尔值

💡 总入口类:FlutterDefend

该类为静态工具类,聚合所有核心安全组件,便于统一调用:

FlutterDefend.secureStorage.write("token", "abc");
FlutterDefend.sqlInjection.containsInjection(userInput);
FlutterDefend.jailbreak.isDeviceCompromised();
FlutterDefend.secureInput.wrapTextField(...);

动态密钥构造器

final storage = FlutterDefend.withPassphrase("session-key");

适用于登录后或会话场景使用自定义密钥。


🔐 安全注意事项

  • 凯撒密码为对称加密中的弱算法,不能满足高级加密需求

    • 推荐配合后端验证、或替换为 AES/GCM 算法
  • 越狱/Root 检测可能被隐藏工具绕过(如 Magisk Hide)

  • 安全应为端到端设计,前端仅为第一道防线


🏁 未来计划(Roadmap)

  • 支持 AES256 加密(基于 pointycastle)
  • SHA 系列一方向加密(如 SHA256)
  • 剪贴板清除/替换机制
  • 屏幕录制检测
  • APK/IPA 篡改检测

👥 作者


🤝 加入技术交流群

欢迎加入我们的技术交流群,与其他安全研究者分享经验和知识!


QQ交流群: 934810107
(扫码加入,一起探讨安全技术)

钉钉交流群
(扫码加入,一起探讨安全技术)

许可证

本项目采用 木兰宽松许可证 (Mulan PSL) 进行许可。
有关详细信息,请参阅 LICENSE 文件。
(魔法契约要保管好哟~)

License: Mulan PSL v2

🌟 开源项目赞助计划

用捐赠助力发展

感谢您使用本项目!您的支持是开源持续发展的核心动力。
每一份捐赠都将直接用于:
✅ 服务器与基础设施维护(魔法城堡的维修费哟~)
✅ 新功能开发与版本迭代(魔法技能树要升级哒~)
✅ 文档优化与社区建设(魔法图书馆要扩建呀~)

点滴支持皆能汇聚成海,让我们共同打造更强大的开源工具!
(小仙子们在向你比心哟~)


🌐 全球捐赠通道

国内用户


🔵 支付宝(小企鹅在收金币哟~)

🟢 微信支付(小绿龙在收金币哟~)

国际用户


📌 开发者社交图谱

技术交流

社交互动


🙌 感谢您成为开源社区的重要一员!
💬 捐赠后欢迎通过社交平台与我联系,您的名字将出现在项目致谢列表!