Самостоятельная проверка подписи APK

Я хотел бы программно выполнить проверку подписи APK во время выполнения. У меня есть хранилище ключей на моей рабочей станции для разработки, поэтому я мог знать (не знаю, как) открытый ключ, которым я подписываю APK.

Как только я узнаю, каким будет открытый ключ после вывески, я хотел бы вставить исходный код и проверить, соответствует ли текущее запущенное приложение ключу.

Является ли это возможным? Если да, то как мне получить открытый ключ из хранилища ключей, созданного Eclipse?

Спасибо.


person usr-local-ΕΨΗΕΛΩΝ    schedule 30.03.2012    source источник
comment
Обратите внимание на службу проверки лицензии Android.   -  person Seva Alekseyev    schedule 30.03.2012
comment
К сожалению, это должно работать в автономном режиме и предназначено для предварительных версий приложения. У меня был связанный вопрос об этом   -  person usr-local-ΕΨΗΕΛΩΝ    schedule 30.03.2012
comment
Самостоятельная проверка не имеет особого смысла с точки зрения безопасности, поскольку злоумышленник может изменить код так, чтобы он принимал все что угодно.   -  person Eugene Mayevski 'Callback    schedule 31.03.2012
comment
Верно, но вместе с обфускацией лишь немного усложняет жизнь злоумышленнику. В моем конкретном случае лицензирование Android совершенно неосуществимо   -  person usr-local-ΕΨΗΕΛΩΝ    schedule 31.03.2012
comment
Чего я не понимаю, так это того, что если какой-то хакер может редактировать ваш apk так, как он хочет, он не может просто удалить заглушку (метод), где вы выполняете эту проверку подписи, чтобы приложение даже ничего не проверяло. Имеет смысл?   -  person eRaisedToX    schedule 24.02.2017
comment
Конечно, но запутывание может немного усложнить задачу.   -  person usr-local-ΕΨΗΕΛΩΝ    schedule 24.02.2017


Ответы (2)


Вы можете попробовать это, это должно сработать

Signature[] sigs = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
    for (Signature sig : sigs)
    {
        // log the sig here
    }
person Faisal Abid    schedule 30.03.2012
comment
Не работает после загрузки в плеймаркет. Пробовал апк перед загрузкой в ​​плеймаркет, работает. Но после загрузки подпись меняется. - person Tenten Ponce; 19.02.2020
comment
@TentenPonce, какое решение? ваша подпись приложения изменилась после загрузки в Google Play? - person Farzad; 04.03.2020
comment
@Farzad все еще ищет другое решение, но мы могли бы попытаться опубликовать предварительную версию, чтобы проверить подпись в магазине воспроизведения, а затем снова перевыпустить ее с подписью, которую мы получили из приложения магазина воспроизведения. - person Tenten Ponce; 04.03.2020
comment
@TentenPonce Могут ли саботажники нейтрализовать это решение, изменив код Java? - person Farzad; 04.03.2020
comment
@Farzad, ну да, они все еще могут удалить код, проверяющий подпись. Как говорится, в безопасности нет серебряной пули. Можно только усложнить, но не предотвратить полностью. - person Tenten Ponce; 09.03.2020
comment
почему меняется подпись после загрузки в плей маркет? - person D.madushanka; 03.02.2021
comment
будет ли это работать для файла aar? - person sinek; 08.07.2021

Я думаю, что у меня такая же ситуация, как и у вас. Вот мое оригинальное решение.

Вы можете попробовать его.

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
Signature releaseSig = context.getPackageManager().getPackageAchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];
return sig.hashCode() == releaseSig.hashCode;
person Shengfeng Li    schedule 27.07.2016