如何在API 28中使用PackageInfo.GET_SIGNING_CERTIFICATES? [英] How to use PackageInfo.GET_SIGNING_CERTIFICATES in API 28?
本文介绍了如何在API 28中使用PackageInfo.GET_SIGNING_CERTIFICATES?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
PackageManager.GET_SIGNATURES的文档说:"API级别28不推荐使用此常量.请改用GET_SIGNING_CERTIFICATES."
The documentation of PackageManager.GET_SIGNATURES says "This constant was deprecated in API level 28. Use GET_SIGNING_CERTIFICATES instead".
不幸的是,它并不安全,很容易被黑客入侵.
Unfortunately it was not secure and was easily hacked.
如何使用Android P引入的新"GET_SIGNING_CERTIFICATES"?
How can you use the new "GET_SIGNING_CERTIFICATES" introduced with Android P?
推荐答案
在 API28或更高版本中,您还应该检查 multipleSigners .
此功能将完成这项工作:
(适用于Android 9.0及更低版本的作品)
This function will do the job:
(Works for Android 9.0 and lower)
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)
}
这篇关于如何在API 28中使用PackageInfo.GET_SIGNING_CERTIFICATES?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文