繁体   English   中英

在JavaFX中从PasswordField获取密码的安全方法

[英]Safe way to get password from PasswordField in JavaFX

有没有办法从JavaFX8中的PasswordField安全地检索密码,所以它没有保存在内存中?

标准选项:

String pass = passwordField.getText();

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

char[] pass = passwordField.getPassword();

无论变量类型是什么(String,char [] ...), 它总是存储在内存中 ,直到垃圾收集器选择它。 虽然我认为这有点困难,但你必须制作一个程序并读取包含变量数据的内存空间才能检索密码。 如果我是你,我不会担心任何窃听:)

与许多事情一样,您可以使用反射来实现这一点。 而且由于你正在使用反射,它不会很漂亮(只看所有这些例外),但我认为这是目前唯一的方法。

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

}

getContent()返回的Content始终是javafx.scene.control.TextField$TextFieldContent实例,因此访问characters字段是安全的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM