You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中计算X.509证书的SHA-1指纹?

修复Flutter应用运行时签名验证问题

核心修改:将X.509证书转换为SHA-1指纹

当前你的Kotlin代码获取的是证书原始内容,需要修改getSignature()方法,直接计算出应用签名的SHA-1哈希值,这样就能和你持有的SHA-1指纹匹配。

修改MainActivity.kt中的getSignature()方法:

private fun getSignature(): String {
    return try {
        val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            packageManager.getPackageInfo(
                packageName,
                PackageManager.GET_SIGNING_CERTIFICATES
            )
        } else {
            @Suppress("DEPRECATION")
            packageManager.getPackageInfo(
                packageName,
                PackageManager.GET_SIGNATURES
            )
        }

        val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            packageInfo.signingInfo.apkContentsSigners
        } else {
            @Suppress("DEPRECATION")
            packageInfo.signatures
        }

        val signature = signatures?.getOrNull(0) ?: return ""
        val certBytes = signature.toByteArray()

        // 计算SHA-1哈希
        val messageDigest = java.security.MessageDigest.getInstance("SHA-1")
        val hashBytes = messageDigest.digest(certBytes)

        // 将字节数组转换为冒号分隔的十六进制字符串
        hashBytes.joinToString(separator = ":") { "%02x".format(it) }.uppercase()
    } catch (e: Exception) {
        e.printStackTrace()
        ""
    }
}

适配Flutter端验证逻辑

  1. 确保你的developerSignature是大写、冒号分隔的SHA-1字符串(格式示例:AA:BB:CC:DD:...),和上面代码生成的格式完全一致。
  2. 取消注释验证失败后的处理逻辑,确保非法签名的应用无法运行:
if (appSignature != developerSignature) {
  print("appSign: $appSignature");
  SystemNavigator.pop();
  throw Exception('Release signature verification failed');
}

安全提示

  • 不要直接硬编码SHA-1到代码中,建议通过字符串混淆或动态加载的方式隐藏,避免被反编译轻易获取。
  • 验证逻辑建议放在应用启动的最早期(比如main()函数开头),防止攻击者绕过验证。

内容的提问来源于stack exchange,提问作者Debabrata Samal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:33:29