Flutter应用保护插件flutter_protector的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter应用保护插件flutter_protector的使用

插件介绍

flutter_protector 是一个Flutter插件,提供了与设备和平台相关的安全功能。该插件通过提供关于设备和平台的信息来增强Flutter应用程序的安全性。它包括模拟器检测、Root/Jailbreak状态、嗅探应用检测、VPN连接状态、代理设置等检查。

重要提示: 虽然此插件提供了有用的检查,但需要注意的是,没有任何单一方法可以保证完全的安全性。这些检查应作为全面安全策略的一部分,包括其他最佳实践,如代码混淆、安全数据存储和服务器端验证。

功能列表

  • 平台版本: 获取平台版本(例如,Android 13)。
  • 模拟器检测: 检查应用程序是否在模拟器上运行(Android)。
  • Root/Jailbreak检测: 检查设备是否已root(Android)。
  • 嗅探应用检测: 检查是否存在已知的嗅探应用。
  • VPN连接检测: 检查当前是否有VPN连接。
  • 代理检测: 检查设备上是否设置了代理。
  • 本地IP地址: 获取设备的本地IP地址。
  • 公共IP检查: 检查设备的IP地址是否为公共IP。
  • 使用网络接口的VPN检查: 检查VPN是否使用了网络接口(如果有VPN连接)。
  • 目标平台Web启动模式检测: 在Web上运行时检测目标平台。
  • IMEI: 获取设备的IMEI。
  • 电话号码: 获取设备的电话号码。
  • 设备ID: 检索设备ID。

开始使用

Android权限配置

为了获取IMEI、电话号码和设备ID,并检查VPN、代理和嗅探应用,需要在AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
    tools:ignore="ProtectedPermissions" />
添加依赖

pubspec.yaml文件中添加插件依赖:

dependencies:
  flutter_protector: ^latest_version # 替换为pub.dev上的最新版本
安装包

运行以下命令安装依赖包:

flutter pub get
导入插件

在Dart代码中导入插件:

import 'package:flutter_protector/flutter_protector.dart';

完整示例Demo

以下是完整的示例代码,展示了如何使用flutter_protector插件:

import 'package:flutter/material.dart';
import 'package:flutter_protector/flutter_protector.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // 确保Flutter绑定初始化
  runApp(MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: Locale("en"), // 设置语言环境
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: SecurityScreen(),
    );
  }
}

class SecurityScreen extends StatefulWidget {
  [@override](/user/override)
  _SecurityScreenState createState() => _SecurityScreenState();
}

class _SecurityScreenState extends State<SecurityScreen> {
  String platformVersion = 'Unknown';
  bool isEmulator = false;
  bool isRooted = false;
  bool isVpnConnected = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    _initData();
  }

  void _initData() async {
    // 获取平台版本
    String version = await FlutterProtector.platformVersion;
    setState(() {
      platformVersion = version;
    });

    // 检测是否为模拟器
    bool emulator = await FlutterProtector.isEmulator;
    setState(() {
      isEmulator = emulator;
    });

    // 检测是否已root
    bool rooted = await FlutterProtector.isRooted;
    setState(() {
      isRooted = rooted;
    });

    // 检测是否有VPN连接
    bool vpn = await FlutterProtector.isVpnConnected;
    setState(() {
      isVpnConnected = vpn;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Security Check'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Platform Version: $platformVersion'),
            Text('Is Emulator: ${isEmulator ? 'Yes' : 'No'}'),
            Text('Is Rooted: ${isRooted ? 'Yes' : 'No'}'),
            Text('Is VPN Connected: ${isVpnConnected ? 'Yes' : 'No'}'),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter应用保护插件flutter_protector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用保护插件flutter_protector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用flutter_protector插件来保护你的应用的示例代码。flutter_protector插件可以用于防止应用被反编译、篡改等,提高应用的安全性。

首先,你需要在你的pubspec.yaml文件中添加flutter_protector依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_protector: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中配置flutter_protector。通常,你会在应用的入口文件(例如main.dart)中进行配置。以下是一个基本的配置示例:

import 'package:flutter/material.dart';
import 'package:flutter_protector/flutter_protector.dart';

void main() {
  // 初始化Flutter Protector
  FlutterProtector.runProtect(
    keys: [
      'your_first_key',  // 请替换为你自己的密钥
      'your_second_key', // 可以添加多个密钥以增加保护强度
    ],
    enableLog: true, // 是否启用日志输出,用于调试
    enableOverlay: true, // 是否启用保护覆盖层,当检测到篡改时显示
    enableAntiDebug: true, // 是否启用防调试功能
    enableAntiEmulator: true, // 是否启用防模拟器功能
    enableObfuscation: true, // 是否启用代码混淆(注意:这通常是在构建过程中由Flutter工具链处理的,而不是在运行时)
    enableIntegrityCheck: true, // 是否启用完整性检查
    checkInterval: Duration(days: 1), // 完整性检查的间隔
    onProtected: () {
      // 当应用受到保护时执行的回调
      print("App is protected.");
    },
    onTampered: () {
      // 当检测到应用被篡改时执行的回调
      showDialog(
        context: MaterialApp(home: Scaffold()).buildContext!, // 注意:这里只是为了示例,实际使用中需要确保context有效
        builder: (context) => AlertDialog(
          title: Text('Warning'),
          content: Text('The app has been tampered with. Please reinstall it from a trusted source.'),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                // 处理用户点击操作,例如退出应用
                Navigator.of(context).pop();
                SystemNavigator.pop(); // 退出应用
              },
              child: Text('Exit'),
            ),
          ],
        ),
      );
    },
  );

  // 正常的应用启动流程
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Protector Demo'),
      ),
      body: Center(
        child: Text('Hello, Flutter Protector!'),
      ),
    );
  }
}

注意

  1. 上面的代码示例中,showDialogcontext用法只是为了演示目的,实际使用中你需要确保context是在有效的Widget树中创建的。通常,你会在应用的主Widget树中处理这类UI操作。
  2. flutter_protector插件的某些功能(如代码混淆)实际上是在构建过程中由Flutter工具链处理的,而不是在运行时。因此,确保你在构建发布版本时启用了适当的混淆和压缩设置。
  3. 密钥管理是非常重要的,确保你的密钥安全存储,不要硬编码在源代码中,特别是在公共仓库中。

这个示例展示了如何集成flutter_protector到你的Flutter应用中,并处理一些基本的安全检查。根据你的具体需求,你可能需要调整这些设置和回调。

回到顶部