Verwenden Sie char[]Array über einen String, um Kennwörter in Java zu ändern.

1. Überblick

In diesem Artikel erklären wir, warum wir char[] ​​array zur Darstellung von Passwörtern anstelle von String in Java verwenden sollten.

  • Bitte beachten Sie, dass sich dieses Tutorial auf die Möglichkeiten zur Manipulation von Passwörtern im Speicher konzentriert, nicht auf die tatsächliche Art der Speicherung, die normalerweise in der Persistenzschicht behandelt wird. **

  • Wir gehen auch davon aus, dass wir das Format des Passworts nicht kontrollieren können (z. B.

Das Passwort stammt von der 3rd Party API in Form des String ).

Obwohl es offensichtlich erscheint, ein Objekt des Typs java.lang.String zum Manipulieren von Kennwörtern zu verwenden, wird von Java-Team selbst empfohlen, stattdessen char[] ​​zu verwenden. **

Wenn wir uns beispielsweise das JPasswordField von javax.swing anschauen, sehen wir die Methode getText () , das String zurückgibt, ist seit Java 2 veraltet und wird durch die Methode getPassword () ersetzt, die char[] ​​zurückgibt.

Lassen Sie uns ein paar wichtige Gründe dafür ausloten, warum dies der Fall ist.

2. Zeichenfolgen sind unveränderlich

_String s in Java sind unveränderlich, was bedeutet, dass sie nicht mithilfe von APIs höherer Ebene geändert werden können. Jede Änderung an einem String -Objekt führt zu einem neuen String_ , wobei der alte im Speicher verbleibt.

Daher ist das in einem String gespeicherte Passwort im Speicher verfügbar, bis Garbage Collector es löscht. Wir können nicht kontrollieren, wann dies geschieht, aber dieser Zeitraum kann erheblich länger sein als für reguläre Objekte, da Strings zur Wiederverwendbarkeit in einem String-Pool gehalten werden.

Daher kann jeder Benutzer mit Zugriff auf den Speicherabzug das Kennwort aus dem Speicher abrufen.

  • Mit einem char[] -Array anstelle des String können wir Daten explizit löschen, nachdem die beabsichtigte Arbeit abgeschlossen ist. Auf diese Weise stellen wir sicher, dass das Kennwort aus dem Speicher entfernt wird, noch bevor die Speicherbereinigung stattfindet. **

Betrachten wir nun die Codeausschnitte, die zeigen, was wir gerade besprochen haben

Zuerst für String :

System.out.print("Original String password value: ");
System.out.println(stringPassword);
System.out.println("Original String password hashCode: "
  + Integer.toHexString(stringPassword.hashCode()));

String newString = "** ** ** ** ** ** ** ** ";
stringPassword.replace(stringPassword, newString);

System.out.print("String password value after trying to replace it: ");
System.out.println(stringPassword);
System.out.println(
  "hashCode after trying to replace the original String: "
  + Integer.toHexString(stringPassword.hashCode()));

Die Ausgabe wird sein:

Original String password value: password
Original String password hashCode: 4889ba9b
String value after trying to replace it: password
hashCode after trying to replace the original String: 4889ba9b

Nun zu char[] :

char[]charPassword = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};

System.out.print("Original char password value: ");
System.out.println(charPassword);
System.out.println(
  "Original char password hashCode: "
  + Integer.toHexString(charPassword.hashCode()));

Arrays.fill(charPassword, '** ');

System.out.print("Changed char password value: ");
System.out.println(charPassword);
System.out.println(
  "Changed char password hashCode: "
  + Integer.toHexString(charPassword.hashCode()));

Die Ausgabe ist:

Original char password value: password
Original char password hashCode: 7cc355be
Changed char password value: ** ** ** ** ** ** ** **
Changed char password hashCode: 7cc355be

Wie wir sehen können, bleibt der Wert, nachdem wir versucht haben, den Inhalt des ursprünglichen String zu ersetzen, derselbe, und die hashCode () -Methode hat in der gleichen Ausführung der Anwendung keinen anderen Wert zurückgegeben.

Und für das char[] -Array konnten wir die Daten in demselben Objekt ändern.

3. Wir können versehentlich Passwörter drucken

Ein weiterer Vorteil der Arbeit mit Kennwörtern im char[] ​​-Array ist die Verhinderung der versehentlichen Protokollierung des Kennworts in Konsolen, Monitoren oder anderen mehr oder weniger unsicheren Orten.

Schauen wir uns den nächsten Code an:

String passwordString = "password";
char[]passwordArray = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
System.out.println("Printing String password -> " + passwordString);
System.out.println("Printing char[]password -> " + passwordArray);

Mit der Ausgabe:

Printing String password -> password
Printing char[]password ->[[email protected]----

Wir sehen, dass der Inhalt selbst im ersten Fall gedruckt wird, während im zweiten Fall die Daten nicht so nützlich sind, was __char[]__ ​​weniger anfällig macht.

[[summary]]

===  **  4. Fazit**

In diesem kurzen Artikel haben wir mehrere Gründe herausgestellt, warum wir ____String____s nicht für das Sammeln von Passwörtern verwenden sollten und warum stattdessen __char[]__ ​​Arrays verwendet werden sollten.

Wie immer finden Sie Codeausschnitte https://github.com/eugenp/tutorials/tree/master/java-strings[over auf GitHub].