2013-12-05 7 views
1

Есть ли способ получить секретный ключ, с которым был подписан текущий 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 с оригинальным сертификатом? (У всех есть доступ к открытому ключу, поэтому он не является хорошим кандидатом для проверки, но частный ключ известен только оригинальному разработчику, который может защитить его (каким-то образом) и проверить сертификацию пакета.)

ответ

1

закрытый ключ используется только для подписания APK и никогда (теоретически) не оставляет места подписания. Таким образом, невозможно восстановить его с APK.

Обновление: и нет, сам код не может проверить правильность его собственного изображения. Если изображение было изменено, тривиально удалить и проверку.

+0

Если бы у нас был доступ к закрытому ключу, только исходный код мог его извлечь и передать его на встроенную проверку (очень сложно декомпилировать) –

+0

Как получается, что только исходный код мог его извлечь? Все могло бы извлечь его. В любом случае ключ отсутствует. –

+0

Если он был там, или если мы можем проверить запущенный пакет с открытым ключом, то, поскольку для ввода или удаления любого кода требуется повторное подписание пакета, новый закрытый ключ больше недействителен –

Смежные вопросы