Flutter安全增强插件security_plus的使用

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

Flutter安全增强插件security_plus的使用

Security Plus

Security Plus 是一个为Flutter应用提供高级安全特性的综合安全插件,包括但不限于Root检测、模拟器检测以及多种安全检查功能。

功能特性

  • 高级Root检测
    • 多层检测机制
    • Frida反篡改保护
    • Magisk检测
    • SuperSU检测
    • 常见Root应用检测
  • 模拟器检测
    • 全面的模拟器环境检查
    • 构建属性分析
    • 硬件特征验证
  • 安全检查
    • 开发模式检测
    • 模拟位置检测
    • 外部存储检查
    • 运行时完整性验证
    • 系统篡改检测

安装与配置

安装

pubspec.yaml文件中添加以下依赖:

dependencies:
  security_plus: ^3.0.1

平台设置

Android

  1. AndroidManifest.xml文件中添加如下权限:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    </manifest>
    
  2. 添加permission_handler用于运行时权限管理:
    dependencies:
      permission_handler: ^10.4.3
    

iOS

Info.plist文件中添加如下内容:

<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when open to verify device security.</string>

使用方法

导入包

在Dart文件中导入security_pluspermission_handler包:

import 'package:security_plus/security_plus.dart';
import 'package:permission_handler/permission_handler.dart';

权限处理与安全检查

以下是一个完整的示例代码,展示了如何进行设备的安全性检查:

import 'dart:async';
import 'dart:developer';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:security_plus/security_plus.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isRooted = false,
      _isDev = false,
      _isExtStorage = false,
      _isEmulator = false;
  bool _isMockLocationEnabled = false;

  @override
  void initState() {
    super.initState();
    _checkPermissionsAndInitialize();
  }

  Future<void> _checkPermissionsAndInitialize() async {
    if (Platform.isAndroid) {
      final locationStatus = await Permission.location.request();
      if (locationStatus.isGranted) {
        await _initializeSecurityChecks();
      } else {
        log('Location permission denied');
        // Handle permission denied case
      }
    } else {
      await _initializeSecurityChecks();
    }
  }

  Future<void> _initializeSecurityChecks() async {
    await isRooted();
    await isExtStorage();
    await isEmulator();
    await isDevelopment();
    await isMockLocationEnabled();
  }

  Future<void> isRooted() async {
    try {
      bool result = Platform.isAndroid
          ? await SecurityPlus.isRooted
          : await SecurityPlus.isJailBroken;
      setState(() {
        _isRooted = result;
      });
    } catch (e) {
      log('\x1B[31m${"=====error======"}\x1B[0m');
      log(e.toString());
    }
  }

  Future<void> isExtStorage() async {
    if (Platform.isAndroid) {
      try {
        bool result = await SecurityPlus.isOnExternalStorage;
        setState(() {
          _isExtStorage = result;
        });
      } catch (e) {
        log('\x1B[31m${"=====error======"}\x1B[0m');
        log(e.toString());
      }
    }
  }

  Future<void> isEmulator() async {
    try {
      bool result = await SecurityPlus.isEmulator;
      setState(() {
        _isEmulator = result;
      });
    } catch (e) {
      log('\x1B[31m${"=====error======"}\x1B[0m');
      log(e.toString());
    }
  }

  Future<void> isDevelopment() async {
    try {
      bool result = await SecurityPlus.isDevelopmentModeEnable;
      setState(() {
        _isDev = result;
      });
    } catch (e) {
      log('\x1B[31m${"=====error======"}\x1B[0m');
      log(e.toString());
    }
  }

  Future<void> isMockLocationEnabled() async {
    if (!Platform.isAndroid) return;
    try {
      bool result = await SecurityPlus.isMockLocationEnabled;
      setState(() {
        _isMockLocationEnabled = result;
      });
    } catch (e) {
      log('\x1B[31m${"=====error======"}\x1B[0m');
      log(e.toString());
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Security Plus Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Device is ${_isRooted ? "" : "not"} rooted'),
              if (Platform.isAndroid) ...[
                Text('App is ${_isExtStorage ? "" : "not"} on external storage'),
                Text('Device is ${_isEmulator ? "" : "not"} an emulator'),
                Text('Device is ${_isDev ? "" : "not"} in development mode'),
                Text('Mock location is ${_isMockLocationEnabled ? "enabled" : "disabled"}'),
              ],
              ElevatedButton(
                onPressed: _checkPermissionsAndInitialize,
                child: const Text('Refresh Security Checks'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

个体安全检查

以下是针对不同安全检查的具体实现:

Root检测

try {
  bool isRooted = await SecurityPlus.isRooted;
  if (isRooted) {
    // 处理Root设备
  }
} catch (e) {
  // 错误处理
}

模拟器检测

try {
  bool isEmulator = await SecurityPlus.isEmulator;
  if (isEmulator) {
    // 处理模拟器检测
  }
} catch (e) {
  // 错误处理
}

开发模式检查

try {
  bool isDevelopmentMode = await SecurityPlus.isDevelopmentModeEnable;
  if (isDevelopmentMode) {
    // 处理开发模式
  }
} catch (e) {
  // 错误处理
}

模拟位置检查

try {
  bool isMockLocation = await SecurityPlus.isMockLocationEnabled;
  if (isMockLocation) {
    // 处理模拟位置
  }
} catch (e) {
  // 错误处理
}

外部存储检查

try {
  bool isOnExternalStorage = await SecurityPlus.isOnExternalStorage;
  if (isOnExternalStorage) {
    // 处理外部存储检测
  }
} catch (e) {
  // 错误处理
}

安全特性

  • Root检测机制
    • 集成RootBeer库进行基础Root检测
    • 检测Frida相关进程和库
    • 扫描常见Root相关的文件和目录
    • 检测已知的Root管理应用程序
    • 检查系统修改和挂钩
  • 防篡改保护
    • 监控已知篡改工具的进程
    • 检测库注入
    • 验证系统属性
    • 运行时完整性检查

示例项目

可以查看 example 目录中的完整示例应用程序,以了解所有特性的演示。

平台支持

平台 支持情况
Android
iOS 🚧

贡献

欢迎贡献!如果您发现bug或希望添加新功能,请提交issue。

许可证

本项目采用MIT许可证,详情请参阅LICENSE文件。

作者

Abdelrahman Bonna创建并维护。

致谢

  • RootBeer - 提供Root检测能力
  • Flutter团队和社区的杰出工作

免责声明

此插件提供了安全特性,但不应被视为您应用程序的唯一安全措施。始终实施多层次的安全策略,并保持安全措施的更新。


更多关于Flutter安全增强插件security_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全增强插件security_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,security_plus 是一个功能强大的 Flutter 插件,用于增强应用的安全性。它提供了多种安全功能,如数据加密、设备指纹、应用完整性校验等。以下是如何在 Flutter 项目中使用 security_plus 插件的一些代码示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  security_plus: ^0.18.6  # 请检查最新版本号

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你需要使用 security_plus 功能的 Dart 文件中导入插件:

import 'package:security_plus/security_plus.dart';

3. 使用示例

数据加密与解密

使用 AES 加密和解密数据:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Security Plus Example'),
        ),
        body: SecurityPlusExample(),
      ),
    );
  }
}

class SecurityPlusExample extends StatefulWidget {
  @override
  _SecurityPlusExampleState createState() => _SecurityPlusExampleState();
}

class _SecurityPlusExampleState extends State<SecurityPlusExample> {
  final key = SecurityKey.aes256();
  String encryptedData = '';
  String decryptedData = '';

  void encryptData(String plainText) async {
    String encrypted = await key.encrypt(plainText);
    setState(() {
      encryptedData = encrypted;
    });
  }

  void decryptData() async {
    String decrypted = await key.decrypt(encryptedData);
    setState(() {
      decryptedData = decrypted;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          TextField(
            decoration: InputDecoration(labelText: 'Plain Text'),
            onChanged: (value) {
              // When text changes, encrypt it
              encryptData(value);
            },
          ),
          Text('Encrypted Data: $encryptedData'),
          ElevatedButton(
            onPressed: () {
              // Decrypt the encrypted data
              decryptData();
            },
            child: Text('Decrypt'),
          ),
          Text('Decrypted Data: $decryptedData'),
        ],
      ),
    );
  }
}

设备指纹

获取设备指纹(设备唯一标识符):

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Device Fingerprint Example'),
        ),
        body: DeviceFingerprintExample(),
      ),
    );
  }
}

class DeviceFingerprintExample extends StatefulWidget {
  @override
  _DeviceFingerprintExampleState createState() => _DeviceFingerprintExampleState();
}

class _DeviceFingerprintExampleState extends State<DeviceFingerprintExample> {
  String deviceFingerprint = '';

  void getDeviceFingerprint() async {
    String fingerprint = await DeviceFingerprint.getFingerprint();
    setState(() {
      deviceFingerprint = fingerprint;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          ElevatedButton(
            onPressed: getDeviceFingerprint,
            child: Text('Get Device Fingerprint'),
          ),
          Text('Device Fingerprint: $deviceFingerprint'),
        ],
      ),
    );
  }
}

应用完整性校验

校验应用的完整性(例如,检查签名是否被篡改):

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('App Integrity Check Example'),
        ),
        body: AppIntegrityCheckExample(),
      ),
    );
  }
}

class AppIntegrityCheckExample extends StatefulWidget {
  @override
  _AppIntegrityCheckExampleState createState() => _AppIntegrityCheckExampleState();
}

class _AppIntegrityCheckExampleState extends State<AppIntegrityCheckExample> {
  bool isAppIntegrityVerified = false;

  void checkAppIntegrity() async {
    bool verified = await AppIntegrity.verifyIntegrity();
    setState(() {
      isAppIntegrityVerified = verified;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          ElevatedButton(
            onPressed: checkAppIntegrity,
            child: Text('Check App Integrity'),
          ),
          Text('App Integrity Verified: $isAppIntegrityVerified'),
        ],
      ),
    );
  }
}

以上示例展示了如何使用 security_plus 插件进行数据加密解密、获取设备指纹以及检查应用完整性。请根据你的具体需求进行调整和扩展。

回到顶部