有没有办法从JavaFX8中的PasswordField安全地检索密码,所以它没有保存在内存中?
标准选项:
String pass = passwordField.getText();
对我来说还不够。我期待这样的事情:
char[] pass = passwordField.getPassword();
答案 0 :(得分:2)
无论变量类型是什么(String,char [] ...)它将始终存储在内存中,直到垃圾收集器选择它为止。虽然我认为这有点困难,但你必须制作一个程序并读取包含变量数据的内存空间才能检索密码。如果我是你,我不会担心任何窃听:)
答案 1 :(得分:1)
与许多事情一样,您可以使用反射来实现这一点。既然你正在使用反射,它就不会很漂亮(只看所有这些异常),但我认为这是目前唯一的方法。
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
字段。