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.
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,
String
beinhaltet 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
String
sie 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
String
besteht 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
GO TO FULL VERSION