Подтвердить что ты не робот

Безопасный способ получить пароль от PasswordField в JavaFX

Есть ли способ безопасно получить пароль из PasswordField в JavaFX8, чтобы он не был сохранен в памяти?

Стандартная опция:

String pass = passwordField.getText();

для меня недостаточно. Я ожидаю что-то вроде этого:

char[] pass = passwordField.getPassword();
4b9b3361

Ответ 1

Независимо от того, какой тип переменной (String, char []...) , он всегда будет храниться в памяти, пока сборщик мусора не заберет его. Хотя я предполагаю, что это будет немного сложно, вам нужно будет сделать программу и прочитать пространство памяти, содержащее переменные данные, чтобы восстановить пароль. Я бы не стал беспокоиться о каких-либо подслушиваниях, если бы я был вами:)

Ответ 2

Как и во многих вещах, вы можете добиться этого, используя отражение. И поскольку вы используете рефлексию, это будет не очень красиво (просто посмотрите на все эти исключения), но я думаю, что это единственный способ на данный момент.

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;
    }

}

Content, возвращаемый getContent(), всегда является экземпляром javafx.scene.control.TextField$TextFieldContent, поэтому он безопасен для доступа к полю characters.