Безопасный способ получить пароль от PasswordField в JavaFX
Есть ли способ безопасно получить пароль из PasswordField в JavaFX8, чтобы он не был сохранен в памяти?
Стандартная опция:
String pass = passwordField.getText();
для меня недостаточно. Я ожидаю что-то вроде этого:
char[] pass = passwordField.getPassword();
Ответы
Ответ 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
.