flutter如何实现apk完整性校验

在Flutter开发中,如何实现APK文件的完整性校验?我担心应用被篡改后重新打包分发,想通过校验APK签名或文件哈希值来验证应用的完整性。是否有成熟的插件或方案推荐?最好能支持Android平台的原生校验机制,同时兼顾性能影响。具体实现时需要注意哪些关键点?

2 回复

在Flutter中实现APK完整性校验,可通过以下步骤:

  1. 获取APK签名信息,使用package_info_plus获取签名哈希。
  2. 与预存的正确签名哈希对比,验证完整性。
  3. 可结合加密库(如crypto)增强安全性。

注意:纯Flutter无法完全防止篡改,建议结合原生代码加固。

更多关于flutter如何实现apk完整性校验的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现APK完整性校验,可以通过以下步骤实现:

  1. 获取APK签名信息
    使用package_info_plus获取包信息,结合平台通道调用原生代码读取签名。

    Android原生代码(Kotlin)

    // MainActivity.kt
    import android.content.pm.PackageManager
    import androidx.annotation.NonNull
    import io.flutter.embedding.android.FlutterActivity
    import io.flutter.embedding.engine.FlutterEngine
    import io.flutter.plugin.common.MethodChannel
    
    class MainActivity: FlutterActivity() {
        private val CHANNEL = "integrity_check"
    
        override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
            super.configureFlutterEngine(flutterEngine)
            MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
                call, result ->
                if (call.method == "getSignature") {
                    try {
                        val info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
                        val signatures = info.signatures
                        val signature = signatures.first().toCharsString()
                        result.success(signature)
                    } catch (e: Exception) {
                        result.error("ERROR", "获取签名失败", null)
                    }
                } else {
                    result.notImplemented()
                }
            }
        }
    }
    
  2. Flutter端调用
    添加package_info_plus依赖后,通过平台通道获取签名:

    import 'package:flutter/services.dart';
    
    class IntegrityChecker {
      static const platform = MethodChannel('integrity_check');
    
      static Future<String?> getSignature() async {
        try {
          final String? signature = await platform.invokeMethod('getSignature');
          return signature;
        } on PlatformException catch (e) {
          print("获取签名失败: ${e.message}");
          return null;
        }
      }
    }
    
  3. 校验逻辑
    将获取的签名与预存储的正确签名对比:

    class AppIntegrity {
      static const String _expectedSignature = "YOUR_EXPECTED_SIGNATURE_HERE";
    
      static Future<bool> verifyIntegrity() async {
        String? currentSignature = await IntegrityChecker.getSignature();
        return currentSignature == _expectedSignature;
      }
    }
    
  4. 使用示例
    在应用启动时校验:

    void main() async {
      bool isValid = await AppIntegrity.verifyIntegrity();
      if (!isValid) {
        SystemNavigator.pop(); // 退出应用
        return;
      }
      runApp(MyApp());
    }
    

注意事项

  • 签名需在编译时预存储,避免硬编码(可通过环境变量注入)。
  • 仅依赖签名校验仍可能被破解,可结合后端API增强安全性。
  • 适用于防止重打包等基础场景,高安全需求需结合其他方案。
回到顶部