来自 adb shell dumpsys 的 PackageSignatures

Fra*_*nez 7 security android adb

我想知道当您使用

adb shell dumpsys package com.myapp
Run Code Online (Sandbox Code Playgroud)

对于给定的已安装应用程序。

我看到两个哈希:

signatures=PackageSignatures{abcabca [xyzxyzxy]}
Run Code Online (Sandbox Code Playgroud)

第一个 (abc) 在每个安装中都不同。对于给定的 apk,第二个 (xyz) 是固定的。

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

Rob*_*ert 1

最新 Android 版本上的签名行如下所示:

signatures=PackageSignatures{9122424 version:2, signatures:[bbb2e2d2], past signatures:[]}
Run Code Online (Sandbox Code Playgroud)

要理解这一行,我们只需查看 AOSP 源代码:PackageSignatures.java

第一部分

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

  • 签名[]签名;
  • int 签名方案版本;
  • 数组集公钥;

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

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

第三部分(签名)

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

Integer.toHexString(mSigningDetails.signatures[i].hashCode())
Run Code Online (Sandbox Code Playgroud)

类 [ ]( https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/content/pm/Signature.javasignatures[i] )的实例在哪里 。android.content.pm.Signature

在此类中定义为由其中是一个字节数组hashCode()生成,该数组似乎包含所使用的 X.509 签名证书的编码版本。或者可以提供原料,因此很难说出具体含量。Arrays.hashCode(mSignature);mSignaturebyte[]

但根据我对您设备的理解,这部分应该直接链接到 APK 文件的签名。