it-swarm.it

Eliminazione di un Java Object in modo sicuro

So che per eliminare un Java dovrei usare l'array di caratteri anziché String, poiché posso tranquillamente cancellare (riscrivere l'array di caratteri con altri dati) il suo contenuto. Questo non sembra essere fattibile per gli oggetti String.

Ora su BlackBerry che è Java, non sono stato in grado di trovare un'API per gestire i dati come array di caratteri, ma sono obbligato a utilizzare String. Pertanto, la mia domanda, nel caso in cui memorizzassi una password in un oggetto, come posso cancellarlo in modo sicuro?

33
smiley

In realtà tu non puoi davvero "cancellare in sicurezza" un array di caratteri in Java. Java esegue l'allocazione della memoria tramite garbage collector , un software complicato che, in pratica, sposta regolarmente gli oggetti di memoria in RAM fisico. Quindi ciò che pensi come "un'istanza char[]" Verrà copiato in più punti e la cancellazione avverrà fisicamente solo in uno di quei punti.

In tale contesto, la "cancellazione sicura" non può realmente esistere in Java. Se si utilizza Java, è necessario assicurarsi che il contesto di utilizzo sia tale da rendere superflua la cancellazione sicura: la "cancellazione sicura" è necessaria principalmente quando il sistema operativo può allocare blocchi RAM non azzerati (quindi un'applicazione può ottenere estratti di vecchi RAM da altre applicazioni) o in presenza di memoria virtuale (parti di RAM copiate su un disco rigido). Immagino che questi non si applichino a un BlackBerry, quindi semplici istanze String dovrebbero andare bene.

Un altro modo per affermare è che se String istanza sono non perfetti per le password, allora hai problemi di sicurezza più grandi della semplice perdita di password . Dopotutto, usi una password per proteggere l'accesso ad alcuni dati, quindi se hai bisogno di "cancellazione sicura" per una password, allora, abbastanza logicamente, avresti anche bisogno di "cancellazione sicura" anche per i dati protetti, e tutto ciò che fai con esso.

(Si può immaginare che non sono un grande fan del concetto di "cancellazione sicura").

43
Thomas Pornin

nel caso in cui memorizzi una password in un oggetto, come posso cancellarla in modo sicuro?

Penso che tu intenda; come puoi impedire a un utente malintenzionato con accesso al dispositivo di recuperare la password?

Dipende dal livello di accesso ottenuto dall'attaccante.

Se l'attaccante è limitato all'API esterna fornita (non una buona ipotesi), è sufficiente il controllo dell'accesso tramite Java.security.AccessController. Se si progettano correttamente i controlli di accesso (molto difficili da eseguire) e l'attaccante non può bypassare i controlli di accesso, il controllo di accesso impedirà all'attaccante di ottenere i dati.

Se l'attaccante si limita a operare all'interno della macchina virtuale Java ma non l'API, è necessario proteggere i dati con KeyStore.PrivateKeyEntry. A questo livello non è possibile fare affidamento sul corretto funzionamento di il tuo progetto per proteggere i dati e devi fare affidamento sulla macchina virtuale Java per fornire protezione.

Se l'attaccante è limitato al sistema operativo (non la Java), non è possibile proteggere i dati. Se l'attaccante può impedire la Java virtuale la macchina funziona come previsto, quindi l'attaccante può bypassare qualsiasi Java.

Se l'attaccante ha accesso fisico al dispositivo è impossibile proteggere i dati da tutti gli attacchi. A questo livello l'attaccante può leggere i dati mentre vengono scritti su RAM, flash, moduli hardware, ecc.

6
this.josh