Come con molte cose, è possibile ottenere questo utilizzando la riflessione. E dal momento che stai usando la riflessione, non sarà carina (guarda solo tutte quelle eccezioni), ma penso che questo sia l'unico modo per ora.
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;
}
}
Il Content
restituito da getContent()
è sempre un'istanza di javafx.scene.control.TextField$TextFieldContent
quindi è sicura per accedere characters
campo.
Quindi sei preoccupato che la password "rimanga" viva perché potrebbe essere stata aggiunta al pool di stringhe JVM? Mi stavo solo chiedendo: anche se è possibile recuperare una serie di caratteri dal campo password ... che non impedisce a questo componente di utilizzare una stringa internamente; e quindi non guadagneresti nulla. – GhostCat
Esatto, questo estende TextField standard, ma spero che esistano versioni sicure come JPasswordField in JavaSE .. – Krzysiek
Penso che la domanda sia valida, dal momento che l'utilizzo di un array di caratteri per le password è l'approccio raccomandato seguito per es. da JPasswordField (https://docs.oracle.com/javase/8/docs/api/javax/swing/JPasswordField.html#getPassword--) e da PasswordCallback (https://docs.oracle.com/javase/8 /docs/api/javax/security/auth/callback/PasswordCallback.html#getPassword--) – Puce