JavaRush /Java Blog /Random-IT /Domande e risposte: perché è meglio memorizzare una passw...

Domande e risposte: perché è meglio memorizzare una password in Java in un array di caratteri anziché in una stringa?

Pubblicato nel gruppo Random-IT
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.
Domande e risposte: perché è meglio memorizzare una password in Java in un array di caratteri anziché in una stringa?  -1
StringPer 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é Stringvengono utilizzati String poolper 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 JPasswordFieldche restituisce char []. Puoi anche provare il metodo deprecato getText (). Perché non seguire le raccomandazioni degli autori del linguaggio?

Motivo 3. Stampa

Con un tipo Stringc'è 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
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION