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.