Java为URL编码字符串提供URLEncoder
类。但是it is considered insecure to store passwords as Strings。此代码是否通过POST HttpsURLConnection
输出流wr
发送密码足够安全?
try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
// Write some post params
for (char c : pass) {
wr.writeBytes(URLEncoder.encode(String.valueOf(c), "UTF-8"));
}
// Write some more
}
一方面,它正在使用字符串。另一方面,这些字符串长度为1个字符,编码后概念上相同。此外,在我看来,这可能会失败多字节字符。攻击者是否能够在内存中找到这些1-char字符串并重建原始密码?有更好的方法吗?
答案 0 :(得分:2)
确实,当使用字符串作为密码时,您无法可靠地丢弃它们,因为您无法手动将String
内容清零(通过反射除外)并且内容将在内存中保留一段未知时间。因此,char[]
通常建议用于任何密码输入,然后手动归零所述char[]
。
然而,攻击绝不容易安装,因为它需要访问内存,运气时机。密码不太可能在内存中保留很长时间,因为GC会完成其工作并且内存会被重用。在大多数情况下,与其他更简单的攻击相比,这种攻击媒介是不可行的。
答案 1 :(得分:0)
OutputStream没有方法 writeBytes ;但它提供了一种write(byte [])方法,可用于通过一次调用来编写密码的所有字符。
除此之外:使用HTTPS的整个想法是连接本身安全加密;因此,无论您是使用单字节还是多字节突发传输此类内容,都无关紧要。
然后:请记住,所有这些类都是抽象,它们是相互分层的。 HTTPS使用TCP;和TCP包有一定的大小;从这个意义上说,无论如何都没有单个字节通过网络。
关于问题的第二部分:你正在迭代一组char值。所以它真的取决于如何创建char数组;但通常情况下,您无需担心(请参阅here该主题)。