PackageSignatures来自adb shell dumpsys

7

我想了解当您使用以下命令获取 PackageSignatures 字段时,该字段中的哈希值到底代表什么意思:

adb shell dumpsys package com.myapp

针对已安装的应用程序。

我看到两个哈希值:

signatures=PackageSignatures{abcabca [xyzxyzxy]}

第一个哈希值(abc)在每个安装的应用程序中都不同。 第二个哈希值(xyz)对于给定的apk是固定的。

此外,我想知道第二个哈希值是否与APK的公共签名有任何关系。我有几个具有相同公共签名的apk,但第二个哈希值却不同。这正常吗?


你能否提供一些使用 signatures 行的真实世界示例,以及 apksigner verify --verbose --print-certs <apkfile.apk> 的输出(apksigner 是 Android SDK 的一部分)? - Robert
1个回答

1
最近Android版本中的签名行如下:
signatures=PackageSignatures{9122424 version:2, signatures:[bbb2e2d2], past signatures:[]}

To understand this line we just have to look into the AOSP source code: PackageSignatures.java

第一部分

第一部分abcabca来自于System.identityHashCode(this)。因此,它为当前PackageSignatures实例生成了Java哈希码。由于该类仅有一个字段PackageParser.SigningDetails mSigningDetails;,哈希码完全取决于类SigningDetails的字段:

  • Signature[] signatures;
  • int signatureSchemeVersion;
  • ArraySet publicKeys;

版本部分(较新的Android版本)

您使用的Android版本似乎有点旧,因为现在第二部分是signatureSchemeVersion - 目前已知有三种签名方案:V1(jarsigner)、v2和v3。

第三部分(签名)

您感兴趣的签名是由以下代码生成的:

Integer.toHexString(mSigningDetails.signatures[i].hashCode())

其中signatures[i]是类[android.content.pm.Signature](https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/content/pm/Signature.java)的实例。

hashCode()在这个类中被定义为由Arrays.hashCode(mSignature);生成,其中mSignature是一个字节数组,似乎包含了所使用X.509签名证书的编码版本。另外,也可以提供原始的byte[],因此很难确定具体内容。

但根据我的理解,在您的设备上,这部分应该直接与APK文件的签名相关联。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接