【发布时间】:2022-11-07 22:27:15
【问题描述】:
我需要阅读平台密钥的签名,它签署了设备上的整个构建。
目前,我可以读取任意包的签名,如com.android.systemui 等。但是,由于某些自定义ROM,不能保证将包安装为系统的一部分。
所以,我的问题是:有没有办法以编程方式在 Android 设备上读取系统的签名签名?
注意:我不是想读取密钥本身。签名,或者它的哈希对我来说就足够了。
【问题讨论】:
标签: android
我需要阅读平台密钥的签名,它签署了设备上的整个构建。
目前,我可以读取任意包的签名,如com.android.systemui 等。但是,由于某些自定义ROM,不能保证将包安装为系统的一部分。
所以,我的问题是:有没有办法以编程方式在 Android 设备上读取系统的签名签名?
注意:我不是想读取密钥本身。签名,或者它的哈希对我来说就足够了。
【问题讨论】:
标签: android
使用“android”作为包名。
private val packageManager: PackageManager = ...
fun getSystemSignature(): ByteArray? {
return getSignature(ANDROID_SYSTEM_PACKAGE_NAME)
}
@Suppress("Deprecation")
private fun getPackageInfo(clientPackageName: String): PackageInfo? {
return when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> {
val flags = PackageManager.GET_SIGNING_CERTIFICATES or PackageManager.GET_PERMISSIONS
packageManager.getPackageInfo(
clientPackageName,
PackageManager.PackageInfoFlags.of(flags.toLong()),
)
}
else -> {
val flags = PackageManager.GET_SIGNATURES or PackageManager.GET_PERMISSIONS
packageManager.getPackageInfo(
clientPackageName,
flags,
)
}
}
}
@Suppress("Deprecation")
private fun getSignature(packageName: String): ByteArray? {
return when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -> {
getPackageInfo(packageName)
?.signingInfo?.signingCertificateHistory?.get(0)?.toByteArray()
}
else -> {
getPackageInfo(packageName)?.signatures?.get(0)?.toByteArray()
}
}
}
【讨论】: