如何在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端验证逻辑
- 确保你的
developerSignature是大写、冒号分隔的SHA-1字符串(格式示例:AA:BB:CC:DD:...),和上面代码生成的格式完全一致。 - 取消注释验证失败后的处理逻辑,确保非法签名的应用无法运行:
if (appSignature != developerSignature) { print("appSign: $appSignature"); SystemNavigator.pop(); throw Exception('Release signature verification failed'); }
安全提示
- 不要直接硬编码SHA-1到代码中,建议通过字符串混淆或动态加载的方式隐藏,避免被反编译轻易获取。
- 验证逻辑建议放在应用启动的最早期(比如
main()函数开头),防止攻击者绕过验证。
内容的提问来源于stack exchange,提问作者Debabrata Samal
相关产品推荐
相关产品推荐

