Wie bei vielen Dingen, können Sie dies mit Reflektion erreichen. Und da du Reflektion verwendest, wird es nicht schön sein (schau dir all diese Ausnahmen an), aber ich denke, das ist der einzige Weg für jetzt.
public class SafePasswordField extends PasswordField {
public final char[] getPassword() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Content c = getContent();
Field fld = c.getClass().getDeclaredField("characters");
fld.setAccessible(true);
StringBuilder sb = (StringBuilder) fld.get(c);
char[] result = new char[sb.length()];
sb.getChars(0, sb.length(), result, 0);
return result;
}
}
Die Content
von getContent()
zurückgekehrt ist immer Instanz javafx.scene.control.TextField$TextFieldContent
so ist es sichercharacters
Feld zuzugreifen.
Sie sind also besorgt über das Passwort "bleiben" am Leben, weil es möglicherweise in den JVM-Pool von Zeichenfolgen hinzugefügt worden ist? Ich frage mich nur: Selbst wenn Sie ein Array von Zeichen aus dem PasswordField abrufen können ... das verhindert nicht, dass diese Komponente intern einen String verwendet; und dann würdest du nichts gewinnen. – GhostCat
Recht, dies erweitert Standard-TextField, aber ich hoffe, dass sichere Version wie JPasswordField in JavaSE .. – Krzysiek
Ich denke, die Frage ist gültig, da die Verwendung eines Char-Array für Passwörter ist der empfohlene Ansatz, z. von JPasswordField (https://docs.oracle.com/javase/8/docs/api/javax/swing/JPasswordField.html#getPassword--) und von PasswordCallback (https://docs.oracle.com/javase/8 /docs/api/javax/security/auth/callback/PasswordCallback.html#getPassword--) – Puce