Java 为 URL 编码字符串提供了 URLEncoder
类。但是it is considered insecure to store passwords as Strings 。此代码通过 HttpsURLConnection
输出流 wr
通过 POST 发送密码是否足够安全?
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 个字符的字符串并重建原始密码?有更好的方法吗?
最佳答案
确实,当使用字符串作为密码时,您无法可靠地丢弃它们,因为您无法手动将 String
内容清零(通过反射除外),并且内容将保留在内存中一个未知的时间。因此,通常建议将 char[]
用于任何密码输入,然后手动将所述 char[]
清零。
然而,攻击绝非易事,因为它需要访问内存,运气好的话。密码不太可能在内存中保留很长时间,因为 GC 会完成其工作并且内存会被重用。在大多数情况下,与其他更简单的攻击相比,这种攻击媒介可能不可行。
关于java - 对密码进行安全 URL 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42331032/