Potresti sentire una domanda del genere in un'intervista per la posizione Java Junior. Ma al mio amico è stato chiesto questo durante un colloquio per la posizione di responsabile tecnico.
String
Per memorizzare dati di testo è possibile utilizzare sia , che un array di caratteri. Ma scegliere consapevolmente l'uno o l'altro per un compito specifico è difficile se non hai ancora riscontrato una situazione simile. Tuttavia, come ha sottolineato il mio amico, qualsiasi domanda relativa a
String
, di solito coinvolge una proprietà speciale delle stringhe chiamata immutabilità (
Immutable
), e lui ne ha approfittato nell'intervista. Quindi, diamo un'occhiata ad un paio di motivi per cui dovresti usare
char []
, e non , per memorizzare la tua password
String
.
Motivo 1. Le stringhe sono immutabili
Poiché le stringhe sono immutabili in Java, la password in testo semplice sarà disponibile in memoria finché il garbage collector non la cancellerà. E poiché
String
vengono utilizzati
String pool
per un uso ripetuto, è abbastanza probabile che la password rimanga in memoria per un lungo periodo, il che non è affatto sicuro.
Il pool di stringhe Java è un pool o un insieme di oggetti (stringhe) che si trova in un posto speciale: l'heap. La stringa in Java è uno dei tipi di dati più comuni. Questo non è un tipo primitivo, ma un oggetto, poiché richiede molte risorse. Quindi, per memorizzare una stringa di quattro caratteri, è necessario allocare 56 byte di memoria. Questo è il motivo per cui le stringhe, come altri oggetti, vengono archiviate nell'heap. |
Chiunque abbia accesso a un dump della memoria può trovare la password in testo normale, il che è un buon motivo per utilizzare una password crittografata anziché in testo semplice. Poiché le stringhe sono immutabili, il loro contenuto non può essere modificato. Qualsiasi modifica creerà una nuova riga. Ma nel caso di
char []
, puoi sostituire qualsiasi dei suoi elementi con zero o un carattere vuoto. Pertanto, memorizzare la password in un array di caratteri riduce chiaramente il rischio di intercettazione della password.
Motivo 2. Raccomandazioni degli autori
Java stesso (beh, attraverso i suoi creatori, ovviamente) consiglia di utilizzare un metodo
getPassword ()
della classe
JPasswordField
che restituisce
char []
. Puoi anche provare il metodo deprecato
getText ()
. Perché non seguire le raccomandazioni degli autori del linguaggio?
Motivo 3. Stampa
Con un tipo
String
c'è sempre il pericolo che il testo memorizzato nella stringa venga stampato nel file di registro o nella console. Allo stesso tempo, se usi
Array
, non stamperai il contenuto dell'array, ma solo la sua posizione in memoria. Naturalmente questo non è esattamente un motivo serio, ma ha comunque senso.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);
String password: Unknown
Character password: [C@110b053
Naturalmente, l'utilizzo
char []
di Java per memorizzare le password di per sé non è una panacea. È necessario prendere precauzioni di sicurezza, come lavorare con gli hash e crittografare le password anziché archiviarle in testo semplice. E, ovviamente, cancellalo dalla memoria subito dopo la procedura di autenticazione.
Basato su materiali rivisitati da Java
GO TO FULL VERSION