java - 对密码进行安全 URL 编码

标签 java security passwords urlencode

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/

相关文章:

java - 通过套接字与多个客户端通信

c - 如何安全地将一组 C 函数实现为自初始化库?

c# - 密码哈希和验证不匹配

php - php/mysql 环境中的 "forgot user password"标准类或脚本?

Java 将多个图像合并为一个更大的图像而不重叠

Java/Spring : How to specify order for nested transactions with TransactionSynchronizationManager

java.util.Abstractlist 处的 Java ConcurrentModificationException

security - Symfony2 安全编码器无法识别 UserInterface 实例

web-services - 如何在生产中处理 SSL 服务器证书?

c# - 使用密码中的随机数字进行身份验证