2013-04-30 4 views
5

Vorrei inviare intenti contenenti informazioni riservate a un'altra app sul sistema, che ho anche scritto. Prima di farlo, devo verificare che l'app a cui li invio sia firmata da me, e non solo una versione canaglia con lo stesso packagename e le stesse classi. Come posso farlo a livello di programmazione?Come posso verificare se un'altra app sul sistema è autentica?

Voglio fare ciò utilizzando gli intenti espliciti inviati tramite startService() e startActivity(), quindi non ci sono preoccupazioni in merito agli intenti di trasmissione. Detto questo, non voglio inviare nulla finché non avrò verificato che il nome del pacchetto da me specificato sia installato e firmato dall'autore (io stesso in questo caso specifico).

+0

In che modo, * specificamente *, stai cercando di "inviare intenti"? Le trasmissioni? Comandi a un servizio tramite 'startService()'? Avvio di un'attività tramite 'startActivity()'? Qualcos'altro? – CommonsWare

+0

Buona richiesta di chiarimenti. Ho aggiornato la domanda. –

+1

In realtà, le trasmissioni sono migliori per il tuo scenario, poiché un semplice permesso di livello 'firma' sarebbe tutto ciò che ti serve. – CommonsWare

risposta

2

Il gestore pacchetti fornirà il certificato di firma per qualsiasi pacchetto installato.

final PackageManager packageManager = context.getPackageManager(); 
final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES); 
CertificateFactory certFactory = null; 
try { 
    certFactory = CertificateFactory.getInstance("X509"); 
} 
catch (CertificateException e) { 
    // e.printStackTrace(); 
} 

for (PackageInfo p : packageList) { 
    String strName = p.applicationInfo.loadLabel(packageManager).toString(); 
    String strVendor = p.packageName; 

    sb.append("<br>" + strName + "/" + strVendor + "<br>"); 

    Signature[] arrSignatures = p.signatures; 
    for (Signature sig : arrSignatures) { 
     /* 
     * Get the X.509 certificate. 
     */ 
     byte[] rawCert = sig.toByteArray(); 
     InputStream certStream = new ByteArrayInputStream(rawCert); 

     X509Certificate x509Cert = null; 
     try { 
      x509Cert = (X509Certificate) certFactory.generateCertificate(certStream); 
     } 
     catch (CertificateException e) { 
      // e.printStackTrace(); 
     } 

     sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>"); 
     sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>"); 
     sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>"); 
     sb.append("<br>"); 
    } 
}