【发布时间】:2017-07-08 22:24:31
【问题描述】:
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 字符字符串并重建原始密码?有没有更好的方法来做到这一点?
【问题讨论】:
-
我不明白你的意思:你不是在谈论如何在内存中表示密码。 您正在谈论传输密码。那是不一样吗?!
-
@GhostCat 我说的是如何在不将密码以不安全的格式存储在内存中的情况下传输密码。
-
@GhostCat 具体来说,我想知道将密码的各个字符存储为字符串是否安全。攻击者能否找到这些字符串并重建密码?
-
这是理论上的攻击。然而,
URLEncoding在这里完全无关紧要且毫无用处。如果您使用 ASCII,您可以将字符转换为字节并通过网络写入。如果您使用的是 unicode,则需要将字符正确映射到字节。 -
@Kayaman 你说 URL 编码没用是什么意思?我发送的字符串看起来像
user=jdoe&pass=12345&someparam=...。当代码到达循环时,它已写入user=jdoe&pass=。如果我不对密码进行 URL 编码,它将不起作用。例如,如果密码类似于my&pass=word,该怎么办?
标签: java security passwords urlencode