Flutter安全增强插件security_plus的使用
Flutter安全增强插件security_plus的使用
Security Plus
Security Plus 是一个为Flutter应用提供高级安全特性的综合安全插件,包括但不限于Root检测、模拟器检测以及多种安全检查功能。
功能特性
- 高级Root检测
- 多层检测机制
- Frida反篡改保护
- Magisk检测
- SuperSU检测
- 常见Root应用检测
- 模拟器检测
- 全面的模拟器环境检查
- 构建属性分析
- 硬件特征验证
- 安全检查
- 开发模式检测
- 模拟位置检测
- 外部存储检查
- 运行时完整性验证
- 系统篡改检测
安装与配置
安装
在pubspec.yaml
文件中添加以下依赖:
dependencies:
security_plus: ^3.0.1
平台设置
Android
- 在
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>
- 添加
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_plus
和permission_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
更多关于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
插件进行数据加密解密、获取设备指纹以及检查应用完整性。请根据你的具体需求进行调整和扩展。