2012-05-04 4 views
22

Ich habe nie zuvor gedacht, nur ich habe die Methode getPassword verwendet, die ein Array von Zeichen zurückgab und ich hatte die getText Methode veraltet gesehen. Aber jetzt, wo ich denke, warum diese Methode war veraltet?.Warum wurde getText() in JPasswordField veraltet?

Die Java Dokumentation erklärt:

Veraltete. Ab Java 2 Plattform v1.2, ersetzt durch .

Ruft einen Teil des von der Komponente dargestellten Texts ab. Gibt eine leere Zeichenfolge zurück, wenn die Länge 0 ist.

Aus Sicherheitsgründen ist diese Methode veraltet. Verwenden Sie stattdessen die Methode getPassword.

Aber was sind diese Sicherheitsgründen? Irgendwelche Ideen dazu?

Vielen Dank im Voraus.

+2

http: // Stackoverflow.com/questions/983964/why-do-jpasswordfield-getpassword-create-a-string-mit-dem-password-in-it – Garbage

Antwort

36

Beim Aufruf getText erhalten Sie eine Zeichenfolge (unveränderliches Objekt), die nicht geändert werden darf (außer Reflektion) und so bleibt das Passwort im Speicher, bis Müll gesammelt.

Beim Aufruf getPassword erhalten Sie ein Char-Array, das geändert werden kann, so dass das Passwort wirklich nicht im Speicher bleiben wird.

8

Der Grund dafür ist, dass wenn Sie nach dem Passwort als String und nicht als Zeichenarray fragen, diese Zeichenfolge, die das Passwort enthält, für einige unbestimmte Zeit im Speicher der Java Runtime herumschweben wird. Es ist denkbar, dass es dort von einer bösartigen Java-Komponente oder einem externen Programm gelesen wird.

Wenn Sie stattdessen ein Char-Array verwenden, können Sie das Kennwort überprüfen und es dann sofort verschlüsseln.

5

Der Grund für dieses Verhalten ist der Java-String-Pool (siehe z. B. this SO question für weitere Informationen). Sobald Sie den Inhalt dieses Passwortfeldes in eine String konvertieren (was passiert, wenn Sie die Methode getText verwenden), wird String in den Pool gestellt und kann von anderen gelesen werden.

Wenn Sie bei der Umsetzung der getPassword Methode aussehen würden (wie in den SO question gesehen werden kann @Garbage als Kommentar auf Ihrer Frage gepostet) Sie können sehen, diese vermeiden sorgfältig String zu schaffen.

Beachten Sie, dass dies auch bedeutet, dass Sie nicht so etwas wie

if (Arrays.equals("mySuperSecretPassword".toCharArray(), passwordField.getPassword())) 

oder Sie noch am Ende mit dem Setzen Sie das Kennwort im Pool tun sollten, und dann könnte man, wie sie leicht die getText Methode verwendet.

+0

Der "Java String Pool" ist für interne Konstanten bei der Kompilierung .. Ich Frage, ob eine Standard-Swing-Texteingabe * wirklich * Praktikums-Textwerte eingegeben. Mein Verständnis wäre, dass die Rückgabe eines char [] -Arrays statt eines unveränderlichen Strings die sofortige Nullstellung des Passworts ermöglicht, um die Sichtbarkeit/Sichtbarkeit im Arbeitsspeicher zu minimieren (bewährte Sicherheitsvorgehensweise). Es ist niemals zu erwarten, dass der String in irgendeiner Weise "interniert" wird. –

5

Try this:

String myPass=String.valueOf(passwordField.getPassword()); 
+1

Das OP fragt nicht, wie man das Passwort als 'String' * bekommt; er fragt * warum das Passwort als 'CharrArray' anstelle von' String' zurückgegeben wird. – Barranka