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

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

标准选项:

String pass = passwordField.getText(); 

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

 char[] pass = passwordField.getPassword(); 

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

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

 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字段是安全的