从JavaFX中的密码字段获取密码的安全方法

2022-09-02 02:04:15

有没有办法安全地从JavaFX8中的密码字段中检索密码,使其不保存在内存中?

标准选项:

String pass = passwordField.getText();

对我来说还不够。我期待这样的事情:

char[] pass = passwordField.getPassword();

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

}

返回的 始终是 的实例,因此可以安全地访问字段。ContentgetContent()javafx.scene.control.TextField$TextFieldContentcharacters


答案 2

无论变量类型是什么(字符串,字符[] ...)它将始终存储在内存中,直到垃圾回收器将其拾取为止。虽然我认为这有点困难,但您必须创建一个程序并读取包含变量数据的内存空间才能检索密码。如果我是你,我不会担心任何窃听:)


推荐