JavaRush /Java-Blog /Random-DE /Fragen und Antworten: Warum ist es in Java besser, ein Pa...

Fragen und Antworten: Warum ist es in Java besser, ein Passwort in einem Zeichenarray statt in einem String zu speichern?

Veröffentlicht in der Gruppe Random-DE
Möglicherweise hören Sie eine solche Frage in einem Vorstellungsgespräch für die Java-Junior-Stelle. Aber das wurde meinem Freund während eines Vorstellungsgesprächs für die Position des Technischen Leiters gefragt.
Fragen und Antworten: Warum ist es in Java besser, ein Passwort in einem Zeichenarray statt in einem String zu speichern?  - 1
Sowohl String, als auch ein Zeichenarray können zum Speichern von Textdaten verwendet werden. Aber die bewusste Wahl des einen oder anderen für eine bestimmte Aufgabe ist schwierig, wenn Sie noch nicht in eine ähnliche Situation geraten sind. Wie mein Freund jedoch betonte, Stringbeinhaltet jede Frage im Zusammenhang mit Strings normalerweise eine spezielle Eigenschaft von Strings namens Immutability ( Immutable), und er nutzte dies im Interview aus. Schauen wir uns also ein paar Gründe an, warum Sie zum Speichern Ihres Passworts char [], und nicht , verwenden sollten String.

Grund 1. Strings sind unveränderlich

Da Zeichenfolgen in Java unveränderlich sind, bleibt Ihr Klartext-Passwort im Speicher verfügbar, bis der Garbage Collector es löscht. Und da Stringsie für den wiederholten Gebrauch verwendet werden String pool, ist die Wahrscheinlichkeit ziemlich hoch, dass das Passwort lange im Gedächtnis bleibt, was überhaupt nicht sicher ist.
Der Java-String-Pool ist ein Pool oder eine Menge von Objekten (Strings), die sich an einem speziellen Ort befinden – dem Heap. String ist in Java einer der häufigsten Datentypen. Dies ist kein primitiver Typ, sondern ein Objekt, da es sehr ressourcenintensiv ist. Um also eine Zeichenfolge mit vier Zeichen zu speichern, müssen Sie 56 Byte Speicher zuweisen. Aus diesem Grund werden Strings wie andere Objekte auf dem Heap gespeichert.
Jeder, der Zugriff auf einen Speicherauszug hat, kann das Passwort im Klartext finden. Dies ist ein guter Grund, ein verschlüsseltes Passwort anstelle von Klartext zu verwenden. Da Zeichenfolgen unveränderlich sind, kann ihr Inhalt nicht geändert werden. Bei jeder Änderung wird eine neue Zeile erstellt. Im Fall von char []können Sie jedoch jedes seiner Elemente durch Null oder ein Leerzeichen ersetzen. Somit verringert die Speicherung des Passworts in einem Zeichenarray deutlich das Risiko, dass das Passwort abgefangen wird.

Grund 2. Empfehlungen der Autoren

Java selbst (natürlich durch seine Entwickler) empfiehlt die Verwendung einer Methode getPassword ()aus der Klasse JPasswordField, die zurückgibt char []. Sie können auch die veraltete Methode ausprobieren getText (). Warum nicht den Empfehlungen der Sprachautoren folgen?

Grund 3. Drucken

Bei einem Typ Stringbesteht immer die Gefahr, dass der im String gespeicherte Text in der Protokolldatei oder in der Konsole ausgegeben wird. Wenn Sie gleichzeitig verwenden Array, wird nicht der Inhalt des Arrays gedruckt, sondern nur dessen Speicherort. Natürlich handelt es sich hierbei nicht gerade um einen schwerwiegenden Grund, aber dennoch macht es auch Sinn.
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
Natürlich char []ist die Verwendung von Java zum Speichern von Passwörtern an sich kein Allheilmittel. Sie müssen Sicherheitsvorkehrungen treffen, z. B. mit Hashes arbeiten und Passwörter verschlüsseln, anstatt sie im Klartext zu speichern. Und natürlich sofort nach dem Authentifizierungsvorgang aus dem Speicher löschen. Basierend auf Materialien von Javarevisited
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION