Flutter安全应用保护插件secure_application的使用

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

Flutter安全应用保护插件secure_application的使用

Flutter插件secure_application(之前名为secure_window)允许开发者保护应用程序内容,防止在特定情况下被查看。该插件支持iOS、Android、Web和Windows平台,并提供了多种方式来确保应用的安全性。

使用方法

安装

在项目的pubspec.yaml文件中添加secure_application作为依赖项:

dependencies:
  secure_application: ^latest_version

导入

在Dart代码中导入secure_application包:

import 'package:secure_application/secure_application.dart';

示例代码

以下是一个完整的示例demo,展示了如何使用secure_application来保护应用内容:

import 'dart:async';

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool failedAuth = false;
  double blurr = 20;
  double opacity = 0.6;
  StreamSubscription<bool>? subLock;
  List<String> history = [];

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

  @override
  void dispose() {
    subLock?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    var width = MediaQuery.of(context).size.width * 0.8;
    return MaterialApp(
      home: SecureApplication(
        nativeRemoveDelay: 1000,
        onNeedUnlock: (secure) async {
          print('need unlock maybe use biometric to confirm and then sercure.unlock() or you can use the lockedBuilder');
          // 可以在这里实现用户认证逻辑,例如使用生物识别或其他方式
          // 如果认证成功,调用 secure.unlock()
          // 如果认证失败,返回 SecureApplicationAuthenticationStatus.FAILED
          return null;
        },
        onAuthenticationFailed: () async {
          setState(() {
            failedAuth = true;
          });
          print('auth failed');
        },
        onAuthenticationSucceed: () async {
          setState(() {
            failedAuth = false;
          });
          print('auth success');
        },
        child: Builder(builder: (context) {
          if (subLock == null)
            subLock = SecureApplicationProvider.of(context, listen: false)
                ?.lockEvents
                .listen((s) => history.add(
                    '${DateTime.now().toIso8601String()} - ${s ? 'locked' : 'unlocked'}'));
          return SecureGate(
            blurr: blurr,
            opacity: opacity,
            lockedBuilder: (context, secureNotifier) => Center(
                child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                ElevatedButton(
                  child: Text('UNLOCK'),
                  onPressed: () => secureNotifier?.authSuccess(unlock: true),
                ),
                ElevatedButton(
                  child: Text('FAIL AUTHENTICATION'),
                  onPressed: () => secureNotifier?.authFailed(unlock: true),
                ),
              ],
            )),
            child: Scaffold(
              appBar: AppBar(
                title: const Text('Secure Window Example'),
              ),
              body: Center(
                child: Builder(builder: (context) {
                  var valueNotifier = SecureApplicationProvider.of(context);
                  if (valueNotifier == null)
                    throw new Exception(
                        'Unable to find secure application context');
                  return ListView(
                    children: <Widget>[
                      Text('This is secure content'),
                      ValueListenableBuilder<SecureApplicationState>(
                        valueListenable: valueNotifier,
                        builder: (context, state, _) => state.secured
                            ? Column(
                                children: <Widget>[
                                  ElevatedButton(
                                    onPressed: () => valueNotifier.open(),
                                    child: Text('Open app'),
                                  ),
                                  state.paused
                                      ? ElevatedButton(
                                          onPressed: () =>
                                              valueNotifier.unpause(),
                                          child: Text('resume security'),
                                        )
                                      : ElevatedButton(
                                          onPressed: () =>
                                              valueNotifier.pause(),
                                          child: Text('pause security'),
                                        ),
                                ],
                              )
                            : ElevatedButton(
                                onPressed: () => valueNotifier.secure(),
                                child: Text('Secure app'),
                              ),
                      ),
                      failedAuth
                          ? Text(
                              'Auth failed we cleaned sensitive data',
                              style: TextStyle(color: Colors.red),
                            )
                          : Text(
                              'Auth success',
                              style: TextStyle(color: Colors.green),
                            ),
                      FlutterLogo(
                        size: width,
                      ),
                      StreamBuilder(
                        stream: valueNotifier.authenticationEvents,
                        builder: (context, snapshot) =>
                            Text('Last auth status is: ${snapshot.data}'),
                      ),
                      ElevatedButton(
                        onPressed: () => valueNotifier.lock(),
                        child: Text('manually lock'),
                      ),
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Row(
                          children: <Widget>[
                            Text('Blurr:'),
                            Expanded(
                              child: Slider(
                                  value: blurr,
                                  min: 0,
                                  max: 100,
                                  onChanged: (v) => setState(() => blurr = v)),
                            ),
                            Text(blurr.floor().toString()),
                          ],
                        ),
                      ),
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Row(
                          children: <Widget>[
                            Text('opacity:'),
                            Expanded(
                              child: Slider(
                                  value: opacity,
                                  min: 0,
                                  max: 1,
                                  onChanged: (v) =>
                                      setState(() => opacity = v)),
                            ),
                            Text((opacity * 100).floor().toString() + "%"),
                          ],
                        ),
                      ),
                      ...history.map<Widget>((h) => Text(h)).toList(),
                    ],
                  );
                }),
              ),
            ),
          );
        }),
      ),
    );
  }
}

关键点说明

  1. SecureApplication:这是必需的顶级组件,用于管理整个应用的安全状态。
  2. SecureGate:用于包裹需要保护的内容,当应用锁定时,这些内容会被模糊处理。
  3. 认证逻辑:在onNeedUnlock回调中实现用户认证逻辑,可以使用生物识别等方式。
  4. 事件流:通过监听authenticationEventslockEvents来响应认证和锁定事件。
  5. UI更新:根据认证结果更新UI,显示不同的提示信息。

通过以上步骤,你可以有效地保护你的Flutter应用内容,确保其在特定情况下不会被未经授权的用户查看。


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

1 回复

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


当然,以下是如何在Flutter应用中使用secure_application插件来保护你的应用的一些代码示例。secure_application插件通常用于保护Flutter应用免受恶意行为的影响,比如代码注入、调试模式检测等。

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

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

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

基本使用示例

1. 检测应用是否在调试模式下运行

你可以使用SecureApplication.isDebuggerAttached来检查应用是否正在被调试。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Secure Application Demo'),
        ),
        body: Center(
          child: FutureBuilder<bool>(
            future: SecureApplication.isDebuggerAttached(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                bool isDebuggerAttached = snapshot.data ?? false;
                return Text(
                  'Is Debugger Attached: ${isDebuggerAttached ? 'Yes' : 'No'}',
                  style: TextStyle(fontSize: 24),
                );
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }
}

2. 防止代码注入

secure_application插件还可以用来防止代码注入,通过检测并阻止某些不安全的操作。不过,具体功能可能会依赖于插件的具体实现和API,以下是一个假设性的代码片段,具体请参考插件的官方文档。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 检查并阻止代码注入(假设性API)
  bool isInjectionDetected = await SecureApplication.detectCodeInjection();
  if (isInjectionDetected) {
    // 退出应用或显示错误消息
    exit(1); // 注意:在真实应用中,应有更优雅的处理方式
  }

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Secure Application Demo'),
        ),
        body: Center(
          child: Text('App is running securely.'),
        ),
      ),
    );
  }
}

注意detectCodeInjection是一个假设性的API,用于说明如何可能使用插件进行代码注入检测。实际使用中,请查阅secure_application插件的官方文档,了解具体的API和使用方法。

重要提示

  • 阅读文档:始终参考secure_application插件的官方文档,因为API可能会随着版本更新而变化。
  • 测试:在生产环境中部署任何安全功能之前,确保在多种测试环境中彻底测试这些功能。
  • 结合其他安全措施secure_application插件只是应用安全策略的一部分,结合其他安全措施(如代码混淆、网络安全措施等)可以提供更全面的保护。

希望这些示例能够帮助你在Flutter应用中使用secure_application插件来增强安全性。

回到顶部