Flutter应用完整性验证插件play_integrity_flutter的使用

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

Flutter应用完整性验证插件 play_integrity_flutter 的使用

简介

play_integrity_flutter 是一个用于 Flutter 应用的插件,可以帮助开发者验证应用的完整性和安全性。该插件通过与 Google Play 的完整性 API 集成,提供了多种方法来检查应用是否被篡改或运行在不安全的环境中。

开始使用

安装

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

dependencies:
  flutter:
    sdk: flutter
  play_integrity_flutter: ^0.0.1

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

导入插件

在你的 Dart 文件中导入 play_integrity_flutter 插件:

import 'package:play_integrity_flutter/play_integrity_flutter.dart';
import 'package:play_integrity_flutter/models/play_integrity_model.dart';

示例代码

以下是一个完整的示例代码,展示了如何使用 play_integrity_flutter 插件来验证应用的完整性:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:play_integrity_flutter/models/play_integrity_model.dart';
import 'package:play_integrity_flutter/play_integrity_flutter.dart';
import 'package:play_integrity_flutter/play_integrity_flutter_platform_interface.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _playIntegrityFlutterPlugin = PlayIntegrityFlutter();
  GooglePlayServicesAvailability? _gmsStatus;
  PlayIntegrity? _playIntegrity;

  @override
  void initState() {
    super.initState();
    initPlatformState();
    initGooglePlayServicesAvailability();
    initPlayIntegrity();
    initPlayIntegrityWithFormattedNonce();
  }

  Future<void> initPlayIntegrityWithFormattedNonce() async {
    PlayIntegrity? playIntegrity;
    Uint8List nonce = Uint8List(16);
    try {
      playIntegrity = await _playIntegrityFlutterPlugin.playIntegrityWithFormattedNoncePayload(
          nonce, 'decryptionKey', 'verificationKey');
    } on Exception {
      playIntegrity = null;
    }

    if (!mounted) return;

    setState(() {
      _playIntegrity = playIntegrity;
    });
  }

  Future<void> initPlayIntegrity() async {
    PlayIntegrity? playIntegrity;

    try {
      playIntegrity = await _playIntegrityFlutterPlugin.playIntegrityPayload(
          'nonce', 'decryptionKey', 'verificationKey');
    } on Exception {
      playIntegrity = null;
    }

    if (!mounted) return;

    setState(() {
      _playIntegrity = playIntegrity;
    });
  }

  Future<void> initGooglePlayServicesAvailability() async {
    GooglePlayServicesAvailability? gmsAvailability;
    try {
      gmsAvailability =
          await _playIntegrityFlutterPlugin.googlePlayServicesAvailability();
    } on PlatformException {
      gmsAvailability = null;
    }

    if (!mounted) return;

    setState(() {
      _gmsStatus = gmsAvailability;
    });
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion =
          await _playIntegrityFlutterPlugin.getPlatformVersion() ??
              'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Running on: $_platformVersion\n'),
              Text('Google Play Services Availability: $_gmsStatus\n'),
              Text('Play Integrity: ${_playIntegrity?.toString()}\n'),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  1. 初始化插件

    • initState 方法中调用 initPlatformStateinitGooglePlayServicesAvailabilityinitPlayIntegrityinitPlayIntegrityWithFormattedNonce 方法来初始化插件并获取相关信息。
  2. 获取平台版本

    • getPlatformVersion 方法用于获取当前平台的版本信息。
  3. 检查 Google Play 服务可用性

    • googlePlayServicesAvailability 方法用于检查 Google Play 服务是否可用。
  4. 验证应用完整性

    • playIntegrityPayload 方法用于生成并验证应用完整性令牌。
    • playIntegrityWithFormattedNoncePayload 方法用于生成带有格式化随机数的完整性令牌。
  5. 显示结果

    • build 方法中,将获取到的信息显示在界面上。

通过以上步骤,你可以轻松地在 Flutter 应用中集成 play_integrity_flutter 插件,确保应用的安全性和完整性。


更多关于Flutter应用完整性验证插件play_integrity_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用完整性验证插件play_integrity_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用play_integrity_flutter插件来进行应用完整性验证的示例代码。这个插件用于与Google Play的Integrity API交互,以验证应用的完整性。

首先,确保你已经在pubspec.yaml文件中添加了play_integrity_flutter依赖:

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

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用play_integrity_flutter插件:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:play_integrity_flutter/play_integrity_flutter.dart';
  1. 初始化插件并请求完整性令牌

你可以在应用启动或用户进行关键操作(如登录)时请求完整性令牌。下面是一个示例代码,展示了如何请求并处理完整性令牌:

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

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

class _MyAppState extends State<MyApp> {
  String? integrityToken;
  String? errorMessage;

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

  Future<void> _requestIntegrityToken() async {
    try {
      // 请求完整性令牌
      final tokenResult = await PlayIntegrity.requestIntegrityToken(nonce: 'your-nonce-value'); // 替换为你的nonce值
      
      // 获取令牌
      setState(() {
        integrityToken = tokenResult.token;
        errorMessage = null;
      });
      
      // 这里你可以将令牌发送到你的服务器进行验证
      // 例如,通过HTTP请求发送令牌
      // final response = await http.post(Uri.parse('你的服务器验证端点'), body: {'token': tokenResult.token});
      
      // 处理服务器响应...

    } catch (e) {
      // 处理错误
      setState(() {
        integrityToken = null;
        errorMessage = e.toString();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Play Integrity Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              if (integrityToken != null)
                Text('Integrity Token: $integrityToken'),
              if (errorMessage != null)
                Text('Error: $errorMessage', style: TextStyle(color: Colors.red)),
              ElevatedButton(
                onPressed: () => _requestIntegrityToken(),
                child: Text('Request Integrity Token'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  • nonce是一个一次性值,用于防止令牌重放攻击。在实际应用中,你应该生成一个安全的、不可预测的nonce值。
  • 完整性令牌应该在你的服务器端进行验证。你需要将令牌发送到你的服务器,然后服务器使用Google Play开发者API来验证令牌的合法性。
  • 上述代码中的http.post部分是一个示例,你需要根据你的后端API进行实际的实现。

这个示例展示了如何在Flutter应用中集成play_integrity_flutter插件,并请求应用的完整性令牌。你可以根据需要扩展这个示例,以适应你的具体需求。

回到顶部