Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Android > сравнить сертификаты пакетов .apk


Автор: Nataly88 7.4.2011, 10:07
Здравствуйте, подскажите пожалуйста, есть ли такая возможность получить от пакета .apk подписанный сертификат, если да, то как это реализовать? архив находится на sd-csrd.

Автор: ivanovpv 7.4.2011, 21:21
Да, конечно переименуйте {myapp}.apk в {myapp}.zip и извлеките Meta-inf/cert.rsa - и сравните его сигнатуру со своим сертификатом.

Автор: Nataly88 7.4.2011, 23:17
а что вы имеете в виду под "своим" сертификатом?(к сожалению не до конца понимаю эту систему) вообще моя задача заключается в сравнении сертификатов 2-ух .apk архивов, необходим ли этот этап - сверять со "своим" сертификатом?

Автор: SneG0K 7.4.2011, 23:24
Полагаю что вам тогда надо извлечь сертификаты из обоих apk и сравнить их подписи между собой
или вы хотите один сертификат перенести на другое приложение?

Автор: Nataly88 8.4.2011, 00:01
нет не хочу,мне именно и нужно взять эти 2 сертификата, 2-ух разных .apk, но суть в том, что я не знаю как это сделать, я нашла такой вариант, как получить подпись, но не уверена, что этого достаточно:
PackageManager pm = getPackageManager();
                        try {
                                PackageInfo info = pm.getPackageInfo("com.example.app",
PackageManager.GET_SIGNATURES);
                                Signature[] sig = info.signatures;
                                String sigstring = new String(sig[0].toChars());
                                //Do something with signature.
                                //System.out.println(sigstring);

                        } catch (NameNotFoundException e) {
                                e.printStackTrace();
                        }

 

Автор: SneG0K 8.4.2011, 00:08
Так что вам надо сделать с этими сертификатами? Взять и?

Автор: Nataly88 8.4.2011, 00:13
и сравнить, если равно, то True иначе false

Автор: SneG0K 8.4.2011, 01:18
Ну, судя по всему ваш код возвращает строку с подписью.
таким же образом можно получить подпись и для второго приложения и просто сравнить эти строки

Автор: ivanovpv 8.4.2011, 07:59
Цитата(Nataly88 @  8.4.2011,  00:17 Найти цитируемый пост)
а что вы имеете в виду под "своим" сертификатом?(к сожалению не до конца понимаю эту систему) вообще моя задача заключается в сравнении сертификатов 2-ух .apk архивов, необходим ли этот этап - сверять со "своим" сертификатом? 


Ну значит я вас неправильно понял... Дело в том, что APK подписываются сертификатом девелопера (самодельным) - http://developer.android.com/guide/publishing/app-signing.html. Если же речь идет о сравнении сертификатов в двух разных APK, то программно как это сделать я не знаю - ваш код очень похож на то что нужно. Как и сказал Snegok - нужно просто сравнить строки.

Рученьками сравнение простое:
1) Извлекаем 2 файлика CERT.RSA 
2) Напускаем на него 
Код

keytool -printcert -file CERT.RSA

он и выдаст вам сигнатуры сертификата, которые надо сличить друг с другом

Автор: Nataly88 8.4.2011, 08:17
спасибо всем, буду пробовать реализовывать.

Автор: Nataly88 9.4.2011, 10:53
мне удалось получить подпись таким образом из пакета, но из архива не удалось,не понимаю в чем проблема, путь указан верно(к архиву производится обращение):
PackageInfo info = pm.getPackageArchiveInfo(Environment.getExternalStorageDirectory()+"/MyFolder/"+"app.apk",
PackageManager.GET_SIGNATURES);
но в info всегда null, а если брать подпись из аналогичного уже установленного приложения - все работает,может, я что-то делаю не так?

Автор: SneG0K 10.4.2011, 05:29
app.apk - это не что иное как зип-архив.
А установленное приложение уже куда-то там прописываеся в телефон.
Т.е. вы если вы должны програмно открыть архив и достать оттуда сертификат, посчитать его CRC (или как там, я не сильно в курсе) и сравнить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)