2015-03-31 13 views
19

Esiste un modo per recuperare in modo sicuro la password da PasswordField in JavaFX8 in modo che non venga salvata in memoria?Modo sicuro per ottenere la password da PasswordField in JavaFX

opzione standard:

String pass = passwordField.getText(); 

non è sufficiente per me. Mi aspetto qualcosa del genere:

char[] pass = passwordField.getPassword(); 
+1

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

+1

Esatto, questo estende TextField standard, ma spero che esistano versioni sicure come JPasswordField in JavaSE .. – Krzysiek

+0

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

risposta

1

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.

2

Indipendentemente dal tipo di variabile (String, char [] ...) verrà sempre archiviato nella memoria, fino a quando il Garbage Collector non lo preleva. Mentre presumo che sarebbe un po 'difficile, dovresti fare un programma e leggere lo spazio di memoria che contiene i dati della variabile al fine di recuperare la password. Non sarei preoccupato per eventuali intercettazioni se fossi in te :)

+3

Concordato - c'è un argomento davvero buono su questo http://security.stackexchange.com/questions/29019/are-passwords-stored-in-memory-safe?rq=1 – Metatron

+0

@Tron Articolo molto interessante e pertinente! Sicuramente vale la pena dare un'occhiata. –

+0

Ma se lo si memorizza come array di caratteri, è possibile decidere di sovrascrivere l'array con, ad esempio, gli 0 "una volta finito di usarlo. Invece di aspettare che il GC funzioni (che non puoi controllare) – niclaslindgren