Есть ли способ получить секретный ключ, с которым был подписан текущий APK?Получить секретный ключ изнутри приложения
Операция полностью безопасна, поскольку любая модификация (инъекция) в приложение потребует новой подписи и новой пары ключей. Так что, если доступный код доступен частному ключу (тот разработчик знает), он доступен только для исходного кода, а не для злонамеренного.
X509Certificate
разрешает доступ к PublicKey, но мне нужен доступ к PrivateKey.
public static X509Certificate GetCertificate(Context context) {
PackageManager pm = context.getPackageManager();
String packageName = context.getPackageName();
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Signature[] signatures = packageInfo.signatures;
byte[] cert = signatures[0].toByteArray();
InputStream input = new ByteArrayInputStream(cert);
CertificateFactory cf = null;
try {
cf = CertificateFactory.getInstance("X509");
} catch(CertificateException e) {
e.printStackTrace();
}
X509Certificate c = null;
try {
c = (X509Certificate) cf.generateCertificate(input);
} catch(CertificateException e) {
}
return c;
}
Edit: Побочный вопрос может быть:
Есть ли способ, чтобы гарантировать, что в настоящее время работает код выполняется внутри APK с оригинальным сертификатом? (У всех есть доступ к открытому ключу, поэтому он не является хорошим кандидатом для проверки, но частный ключ известен только оригинальному разработчику, который может защитить его (каким-то образом) и проверить сертификацию пакета.)
Если бы у нас был доступ к закрытому ключу, только исходный код мог его извлечь и передать его на встроенную проверку (очень сложно декомпилировать) –
Как получается, что только исходный код мог его извлечь? Все могло бы извлечь его. В любом случае ключ отсутствует. –
Если он был там, или если мы можем проверить запущенный пакет с открытым ключом, то, поскольку для ввода или удаления любого кода требуется повторное подписание пакета, новый закрытый ключ больше недействителен –