Utilizzo di Android Keystore

6

Uso il keystore Android per archiviare un crittografico asimmetrico (per decodificare un file contenente una chiave asimmetrica). L'ho fatto perché voglio crittografare un grande insieme di dati e un asimmetrico non è abbastanza ans hanno keystore ha le chiavi simmetriche dal 23 SDK.

  • Nel classico HSM non è possibile accedere alle chiavi di crittografia, si inviano solo i dati e HSM esegue le operazioni di crittografia. Ma in Android recuperi dal Keystore la chiave per eseguire manualmente le operazioni (Con Cipher ecc.). È sicuro?
  • Se non è sicuro, è possibile cancellare i tasti dalla memoria dopo averli utilizzati? (Alla fine delle mie funzioni, per esempio)
  • Se è sicuro, quali sono i rischi? Avere la RAM corrotta da un virus?
posta AndoKarim 30.03.2018 - 14:15
fonte

4 risposte

4

Diamo un'occhiata ai documenti dello sviluppatore Android "Sistema di archivio di chiavi Android" . Dovremo suddividerlo in base a come usi l'oggetto KeyStore . Se utilizzi Android KeyStore KeyStore.getInstance("AndroidKeyStore") , quindi:

1) Se il dispositivo su cui è in esecuzione l'app ha una memoria protetta con backup hardware, quindi

Key material may be bound to the secure hardware (e.g., Trusted Execution Environment (TEE), Secure Element (SE)) of the Android device. When this feature is enabled for a key, its key material is never exposed outside of secure hardware.

L'articolo "Sistema di archiviazione dei loghi Android" fornisce ulteriori informazioni su come utilizzare questa funzione.

2) Se il dispositivo non dispone di memoria protetta con backup hardware, quindi:

Key material never enters the application process. When an application performs cryptographic operations using an Android Keystore key, behind the scenes plaintext, ciphertext, and messages to be signed or verified are fed to a system process which carries out the cryptographic operations.

Presumibilmente questo processo di sistema è scritto in C dove hanno più controllo sulla gestione della memoria e può azzerare la chiave correttamente quando esce dall'ambito dell'applicazione (che mi porta alla mia sfuriata sui garbage collector ...)

3) Se per qualche motivo usi KeyStore.getInstance("JKS") come negli esempi qui - forse tu è necessario accedere alle chiavi private per qualche motivo oppure è necessario caricare / archiviare le chiavi private in un file .jks , quindi No, non è possibile cancellarle : perché il garbage collector Java è < a href="https://stackoverflow.com/q/38665202/1907046"> famoso per restituire memoria al sistema operativo senza azzerarlo o azzerarlo . Dai documenti per sviluppatori Android , non vedo alcuna prova che il garbage collector Dalvik funzioni in modo diverso.

Inoltre, uno dei meccanismi del garbage collector Java consiste nel creare una copia di qualsiasi variabile heap attualmente riferita dal programma e quindi liberare il vecchio heap. Ciò significa che una copia della tua chiave privata può essere riattivata sul sistema operativo ancor prima che vada esclusa.

In conclusione: se l'oggetto Android KeyStore viene utilizzato correttamente, le tue chiavi private rimarranno saldamente all'interno del processo Trusted Execution Environment (TEE), Secure Element (SE)) o del sistema.

Se per qualche motivo porti la chiave privata nella tua app, tutte le scommesse sono disattivate perché in Java / Dalvik / Android, una volta che qualcosa è nella memoria della tua app, è quasi impossibile cancellarla o azzerarla.

    
risposta data 29.05.2018 - 20:03
fonte
4

Le altre risposte trattano tutto abbastanza bene, ma un aspetto sembra essere frainteso. Come le altre risposte citate, ...

Key material never enters the application process. When an application performs cryptographic operations using an Android Keystore key, behind the scenes plaintext, ciphertext, and messages to be signed or verified are fed to a system process which carries out the cryptographic operations.

Ciò significa che un'applicazione Android non può recuperare alcun byte della chiave attraverso alcun mezzo supportato. Questa applicazione è possibile perché Android (e Java) ottengono l'accesso al materiale della chiave non elaborata tramite un unico metodo, Key.getEncoded() , nell'interfaccia Key . Per le chiavi gestite dal keystore Android, Key.getEncoded() restituisce null .

    
risposta data 30.05.2018 - 04:26
fonte
0

Se davvero hai bisogno di importare i dati chiave in AndroidKeyStore (ad esempio, devi eseguire alcune operazioni che l'archivio chiavi non supporta), non è immediatamente ovvio come assicurarsi che non rimanga nella memoria dell'applicazione . Comunque ho giocato con me stesso e sembra che tu sia abbastanza sicuro se fai quanto segue:

  • Assicurati che i tuoi dati chiave vengano sempre memorizzati solo in byte[] o simili (non in String o in altri oggetti che potrebbero copiare i dati).
  • Implementa la tua classe * KeySpec che non esegue alcuna copia dei dati (quelli predefiniti lo fanno e non esiste un modo semplice per cancellare i dati copiati come se fossero privati)
  • Sovrascrivi byte[] contenente i dati chiave non appena viene inserito nel keystore.
  • Il bit della chiave: memorizza immediatamente un'altra voce fittizia nel keystore utilizzando zero o dati indesiderati. Questo sembra essere l'unico modo per cancellare la copia creata mentre si esegue il parcelling dei dati da inviare tramite RPC al servizio del keystore.

Spero che questo aiuti.

    
risposta data 07.08.2018 - 06:15
fonte
-1

in Android recuperi dal Keystore la chiave per eseguire manualmente le operazioni. È sicuro?

Dalla documentazione di Android:

Key material never enters the application process. When an application performs cryptographic operations using an Android Keystore key, behind the scenes plaintext, ciphertext, and messages to be signed or verified are fed to a system process which carries out the cryptographic operations. https://developer.android.com/training/articles/keystore.html

Quindi mentre si sta utilizzando manualmente la classe Cipher e si recupera la chiave, questo viene effettivamente eseguito in un processo di sistema, NON nella propria applicazione. Hai ragione nel fatto che puoi echo fuori la chiave se vuoi (che non sarà sicuro), ma la semplice scansione della tua applicazione (o della memoria utilizzata da essa) non produrrà una chiave.

Se non è sicuro, è possibile cancellare i tasti dalla memoria dopo averli usati?

Nessuna necessità. Il processo di sistema che esegue le operazioni fa questo per te.

Se è sicuro, quali sono i rischi? La RAM è danneggiata da un virus?

Lo scenario reale non sicuro è che se il dispositivo non ha un elemento sicuro, è possibile leggere il KeyStore.

Dalla documentazione di Android:

If the Android OS is compromised or an attacker can read the device's internal storage, the attacker may be able to use any app's Android Keystore keys on the Android device, but not extract them from the device. https://developer.android.com/training/articles/keystore.html

    
risposta data 30.03.2018 - 16:56
fonte

Leggi altre domande sui tag