Сравнение подписей apks

У меня есть два файла .apk, которые должны быть разными версиями одного и того же приложения. Каков наилучший способ проверить, были ли они подписаны одним и тем же ключом?

Я хочу убедиться, что не было допущено ошибок, и более новая версия будет рассматриваться как обновление того же приложения.

Ключ является лишь частью того, что можно было бы считать обновлением. Вы можете использовать один и тот же ключ для подписи нескольких приложений. Другой важной частью обеспечения того, чтобы приложение было обновлено, являются пакеты, имеющие одинаковое имя пакета.
да. Я знаю об этом, однако, насколько я знаю, я в порядке с именами пакетов. где в apk будет указано имя пакета (просто чтобы я мог убедиться?)
Если вы откроете AndroidManifest.xmlфайл, вы сможете найти имя пакета даже без декомпиляции приложения. Он должен быть в начале файла между некоторыми символами.

Ответы (2)

Для обновления APK-файла должны совпадать два свойства:

  1. Имя пакета приложения (можно увидеть AndroidManifest.xmlпосле его декомпиляции)
  2. Подпись приложения должна совпадать (используемый сертификат подписи должен быть таким же).

Лучший способ проверить подпись файла APK и просмотреть используемый сертификат подписи и открытый ключ для использования apksigner.jarв Android SDK (инструменты сборки):

В следующем примере выполняется проверка двух версий приложения Samsung E-Mail с использованием apksigner:

java -jar <path to apksigner>\apksigner.jar verify -verbose --print-certs "Samsung Email_v4.2.74.1_apkpure.com.apk"
java -jar <path to apksigner>\apksigner.jar verify -verbose --print-certs "Samsung Email_v4.1.43-5_apkpure.com.apk"

Каждый раз, когда вы получаете такой вывод:

Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1
Signer #1 certificate DN: EMAILADDRESS=android.os@samsung.com, CN=Samsung Cert, OU=DMC, O=Samsung Corporation, L=Suwon City, ST=South Korea, C=KR
Signer #1 certificate SHA-256 digest: 34df0e7a9f1cf1892e45c056b4973cd81ccf148a4050d11aea4ac5a65f900a42
Signer #1 certificate SHA-1 digest: 9ca5170f381919dfe0446fcdab18b19a143b3163
Signer #1 certificate MD5 digest: d087e72912fba064cafa78dc34aea839
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 0470be656b9375d253fbb94c3a87dc7040e2f2760c19c4292eb62cc68e02de4a
Signer #1 public key SHA-1 digest: df1e4fd4fc2ebfc187f79309dfc6a4c662bda4d0
Signer #1 public key MD5 digest: 7c6371f33db3b4361504cb13beb6e818

Вам нужно только сравнить дайджест sha256 сертификата и/или открытого ключа . Если для обоих APK они одинаковы, вы можете быть уверены, что они были выпущены одним и тем же лицом или компанией (если только владелец приложения не продал приложение кому-то другому или закрытый ключ не был украден).

Вам нужно проверить две вещи:

  1. идентичны ли имена пакетов,
    см.: Прочитайте имя пакета Android APK на нашем дочернем сайте. Короче: Беги aapt dump badging file.apkи берегись package:. Если имена пакетов идентичны, это должно быть одно и то же приложение, но все еще неясно, созданы ли они одним и тем же разработчиком и, следовательно, будет ли «новый» считаться «действительным обновлением» или «проверка подписи» не удастся. в этом процессе.
  2. совпадают ли подписи.
    Это означает, подписаны ли они одним и тем же ключом, что должно гарантировать, что они были (созданы и подписаны) одним и тем же разработчиком, который должен был хранить свой ключ подписи в секрете. Опять же, смотрите на нашем дочернем сайте: Как просмотреть личность человека, подписавшего apk на устройстве Android? // Получение сведений о сертификате из apk .

Обратите внимание, что для описанных задач требуется хотя бы базовая установка инструментов разработчика Android. aaptявляется даже частью минимальной установки ADBjarsignerи keytoolдля этого потребуется более полный пакет (хотя, если вы работаете в Linux, opensslпредлагает другой подход — подробности можно найти в связанных сообщениях из Stack Overflow.