【问题标题】:Securely URL-encode a password安全地对密码进行 URL 编码
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 阅读链接的帖子。这是关于将密码存储为字符串,而不是关于传输中的安全性。我实际上正在使用DataOutputStream。我会把它添加到我的问题中。
  • char 数组是从例如创建的JPasswordField.getPassword().
  • @BrianMcCutchon 换句话说:你可以相信这个char数组代表密码;因为您依赖于经过良好测试且受信任的库组件从您那里获取它。换句话说:您不必担心该数组中的单个字符无法用 utf8 表示。
  • 在这一点上很公平,但这让我的主要问题(安全)没有得到解答。 (UTF-8 部分只是我在写问题时想到的。)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多