android - 如何在 API 28 中使用 PackageInfo.GET_SIGNING_CERTIFICATES?
问题描述
PackageManager.GET_SIGNATURES 的文档说“此常量在 API 级别 28 中已弃用。请改用 GET_SIGNING_CERTIFICATES”。
不幸的是,它并不安全,很容易被黑客入侵。
如何使用 Android P 引入的新“GET_SIGNING_CERTIFICATES”?
解决方案
在API28 或更高版本中,您还应该检查多个签名者。
此功能将完成工作:(
适用于 Android 9.0 及更低版本)
fun getApplicationSignature(packageName: String = context.packageName): List<String> {
val signatureList: List<String>
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// New signature
val sig = context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES).signingInfo
signatureList = if (sig.hasMultipleSigners()) {
// Send all with apkContentsSigners
sig.apkContentsSigners.map {
val digest = MessageDigest.getInstance("SHA")
digest.update(it.toByteArray())
bytesToHex(digest.digest())
}
} else {
// Send one with signingCertificateHistory
sig.signingCertificateHistory.map {
val digest = MessageDigest.getInstance("SHA")
digest.update(it.toByteArray())
bytesToHex(digest.digest())
}
}
} else {
val sig = context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures
signatureList = sig.map {
val digest = MessageDigest.getInstance("SHA")
digest.update(it.toByteArray())
bytesToHex(digest.digest())
}
}
return signatureList
} catch (e: Exception) {
// Handle error
}
return emptyList()
}
并且byteToHex
是:
fun bytesToHex(bytes: ByteArray): String {
val hexArray = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F')
val hexChars = CharArray(bytes.size * 2)
var v: Int
for (j in bytes.indices) {
v = bytes[j].toInt() and 0xFF
hexChars[j * 2] = hexArray[v.ushr(4)]
hexChars[j * 2 + 1] = hexArray[v and 0x0F]
}
return String(hexChars)
}
推荐阅读
- python - AttributeError:'str' 对象没有属性'path',我在添加图像路径时收到此错误?
- vb.net - 如何通过更改 vb .net 中的自定义属性网格来更改标签字体?
- kotlin - Serenity BDD 项目模式
- javascript - 如何在表中传递隐藏字段并在 tr 单击时返回 jquery 中的值
- javascript - 自己的测试币/代币
- spring - 从 New Relic 警报策略中排除特定端点
- python - 如何使用 Open CV 和 Python 连接到康耐视相机
- ssl - SSL_read 无法读取服务器发送的所有字节
- java - java.lang.VerifyError:拒绝尝试子类型错误类 java.awt.geom.Point2D 的类 java.awt.Point:Android Studio
- graphql - 折扣价不适用于 magento 2 graphql 产品查询中的捆绑产品选项价格