2015-03-31 6 views
19

Gibt es eine Möglichkeit, das Passwort von PasswordField in JavaFX8 sicher zu erhalten, damit es nicht im Speicher gespeichert wird?Sicherer Weg, Passwort von PasswordField in JavaFX zu erhalten

Option Standard:

String pass = passwordField.getText(); 

ist nicht genug für mich. Ich erwarte so etwas:

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

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

+1

Recht, dies erweitert Standard-TextField, aber ich hoffe, dass sichere Version wie JPasswordField in JavaSE .. – Krzysiek

+0

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

Antwort

1

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.

2

Egal was der Variablentyp ist (String, char [] ...) wird immer im Speicher gespeichert, bis der Garbage Collector es abholt. Während ich annehme, dass es ein bisschen schwierig wäre, müssten Sie ein Programm machen und den Speicherraum lesen, der die Daten der Variablen enthält, um das Kennwort zu erhalten. Ich wäre nicht besorgt über Lauschangriffe, wenn ich Sie wäre :)

+3

Einverstanden - es gibt ein wirklich gutes Thema in Bezug auf diese http://security.stackexchange.com/questions/29019/are-passwords-stored-in-memory-safe?rq=1 – Metatron

+0

@Tron Sehr interessante und relevante Artikel! Auf jeden Fall einen Blick wert. –

+0

Aber wenn Sie es als Char-Array speichern, können Sie entscheiden, das Array zum Beispiel mit 0s zu überschreiben, wenn Sie es einmal benutzt haben. Im Gegensatz zu warten auf den GC zu laufen (die Sie nicht kontrollieren können) – niclaslindgren

Verwandte Themen