2016-05-30 34 views
7

Ho un'applicazione Android che utilizza WebRTC. Tutto funziona perfettamente. Ma ora, il problema principale, con la crittografia.Trasferisci PrivateKey da KeyStore, utilizzare in OpenSSL con JNI

Per effettuare chiamate e trasferire dati, WebRTC crea e utilizza un singolo KeyPair per ogni chiamata. Ma voglio usare personalizzato KayPair da AndroidKeyStore. Per questo problema ho bisogno di inviare il proprio KeyPair all'oggetto condiviso OpenSSL per funzionare.

La correzione sarà nel codice OpenSSL natale, dove WebRTC è sempre contesto OpenSSL per i dati di crittografia che utilizzano questa funzione (opensslidnetity.cc):

bool OpenSSLIdentity::ConfigureIdentity 
{ 
    ... 
} 

Come trasferimento PK da AndroidKeyStore a WebRTC codice nativo? Un altro caso, come funziona la crittografia personalizzata PK per WebRTC?


AndroidKeyStore

In Java posso aprire il KeyStore (AndroidKeyStore) e ottenere la chiave pubblica - che pronti a trasferire (ha byte di chiave con il metodo - getEncoded()). Inoltre posso ottenere la chiave privata per i dati di crittografia, ma non posso inviare questa chiave in byte, perché getEncoded() restituisce null. In questo caso, ho pensato, posso ottenere PublicKey abd PrivateKey e salvarli in una matrice di byte. E dopo, chiama i metodi preparati nel codice nativo.


UPDATE: C'è qualcosa di simile si trova nella google.source.chromium. Dove ricevono la chiave da Android KeyStore e creano il contesto OpenSSL nel codice nativo. Classe nativa per ottenere e utilizzare AndroidKeyStore per TLS - Link 1 e Link 2.

+0

Penso che Alex abbia ragione. Tuttavia, ci sono molte cose interessanti che puoi fare con Reflection. – jww

+0

Non credo, perché funziona in criptazione e la realizzazione di java basata su nativo ... Se con la riflessione sarebbe così facile, non c'era protezione .. – GensaGames

+0

Assicurati che le mie modifiche al titolo fossero corrette. Ho pensato che stavi usando Java e poi chiamassi OpenSSL (o altri oggetti condivisi) tramite JNI. Ma sembra che mi stia sbagliando. – jww

risposta

2

Android Keystore non espone il materiale chiave delle chiavi private o segrete, in base alla progettazione (vedere https://developer.android.com/training/articles/keystore.html). Le opzioni disponibili sono:

  • Presente Android Keystore PrivateKey + Firma o Cipher come OpenSSL EVP_PKEY.

  • Non utilizzare Android Keystore. Forse non hai bisogno delle protezioni aggiuntive offerte rispetto alla memorizzazione di chiavi private all'interno del tuo processo?

+0

2) Non utilizzare Android Keystore - Ho bisogno di AndroidKeyStore, ma so, questa non è la soluzione migliore. – GensaGames

+0

1) Presente Android Keystore PrivateKey - Forse questa è un'opzione per me. Ma come si fa? Problema di avere solo alias e keystore, non password o firma ... – GensaGames

+0

È possibile ottenere un'istanza PrivateKey da Android Keystore utilizzando KeyStore ks = KeyStore.getInstance ("AndroidKeyStore"); ks.init (null); Chiave PrivateKey = (PrivateKey) ks.getKey (alias, null); –