Java char 数组jPasswordField处理和SQL更新语句

TLDR; 是通过String类以String.valueOf(charArray);的forms解析char数组String.valueOf(charArray); 比制作​​String类的对象更安全吗? 我正在尝试理解/扩展其中的讨论: 为什么char []首选String而不是密码?

我刚刚读了很多关于如何在Java中“安全地”处理密码的问题,但仍有一个问题我不太清楚如何解决。 当您从jPasswordField获取密码时,它将作为一个字符数组。 这很好,因为你可以更容易用零覆盖数组,而不是等待垃圾收集器来清除像字符串等诸如此类的东西。

我的问题在于:当我想在SQL中运行更新语句来更新密码时,我根本无法输入字符数组,因为格式错误。 当我做像Arrays.toString(arrayName); 我用格式得到它:

 [e, a, c, h, o, f, t, h, e, l, e, t, t, e, r, s] 

我可以将它放入数据库列的唯一方法是……让我们说VARCHAR(100)没有所有的逗号和空格似乎是这样写的:

 String stringPassword=""; int i=0; for(char a:newPassword){ stringPassword=stringPassword+newPassword[i]; i++; } 

如果我做这样的事情,我是否已经破坏了使用字符数组的全部意义? 谷歌搜索并没有真正帮助我解决这个问题。

在此先感谢您的时间。

编辑1:感谢KKaar提供可能的解决方案:

 char[] passwordArray; String.valueOf(passwordArray); 

这对于我需要它的目的来说效果很好,但是我仍然不知道它是否安全。 如果我在preparedStatement语法中创建String.valueOf(passwordArray) ,它不会生成变量,但它仍然通过String类解析值。 这是否意味着它仍处于危险之中,还是安全的?

String.valueOf(charArray)创建一个String,同样不安全。

现在可以使用JDBC:

 char[] password = ...; try (PreparedStatement stmt = con.prepareStatement("...")) { Reader reader = new CharArrayReader(password); stmt.setCharacterStream(1, reader); stmt.executeUpdate(); stmt.clearParameters(); } Arrays.fill(password, ' '); 

这确保了在执行此代码之后,没有任何对象浮动以进行垃圾回收,这可能会显示密码。

当然,如果JDBC驱动程序没有泄漏。 clearParameters似乎有点过头了,但谁知道呢。

CharArrayReader不会复制传递的数组,因此这也是安全的。


要求具体代码:

 String sql = "UPDATE teachers SET password=? WHERE firstname=? AND lastname=?"; try (PreparedStatement pStat = con.prepareStatement(sql)) { Reader reader = new CharArrayReader(newPassword); pStat.setCharacterStream(1, reader); pStat.setString(2, firstName); pStat.setString(3, lastName); pStat.executeUpdate(); pStat.clearParameters(); } Arrays.fill(newPassword, ' '); 

由于声明应该关闭,我冒昧地使用局部变量。