安全地对密码进行URL编码

时间:2017-02-19 18:20:05

标签: java security passwords urlencode

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字符串并重建原始密码?有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

确实,当使用字符串作为密码时,您无法可靠地丢弃它们,因为您无法手动将String内容清零(通过反射除外)并且内容将在内存中保留一段未知时间。因此,char[]通常建议用于任何密码输入,然后手动归零所述char[]

然而,攻击绝不容易安装,因为它需要访问内存,运气时机。密码不太可能在内存中保留很长时间,因为GC会完成其工作并且内存会被重用。在大多数情况下,与其他更简单的攻击相比,这种攻击媒介是不可行的。

答案 1 :(得分:0)

OutputStream没有方法 writeBytes ;但它提供了一种write(byte [])方法,可用于通过一次调用来编写密码的所有字符。

除此之外:使用HTTPS的整个想法是连接本身安全加密;因此,无论您是使用单字节还是多字节突发传输此类内容,都无关紧要。

然后:请记住,所有这些类都是抽象,它们是相互分层的。 HTTPS使用TCP;和TCP包有一定的大小;从这个意义上说,无论如何都没有单个字节通过网络。

关于问题的第二部分:你正在迭代一组char值。所以它真的取决于如何创建char数组;但通常情况下,您无需担心(请参阅here该主题)。