gpt4 book ai didi

java - 为了安全起见,将 new String(char[]) 作为密码参数传递给只接受字符串作为参数的方法是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:46 25 4
gpt4 key购买 nike

我读过关于密码,使用 char[] 更为理想,因为 Strings 是不可变的。问题是,我需要将密码参数传递给调用 http 调用的第三方依赖项。它只接受字符串。该调用涉及在消息中发送密码,因此我使用以下方法:

new Request.Builder()
.url("notmyapi.com/login")
.method("POST", new FormBody.Builder()
.add("name", username)
.add("password", password)
.build())
.build()

我知道 web api 只接受密码而不是接受 base64 版本或其他任何东西可能很糟糕,但这不是我的,我只需要做我的工作。

问题:

由于我现在将密码作为 char[] 传递,但是上面的 .add(key, value) 方法只接受一个字符串,它安全吗做 .add("password", new String(password)) ?这会不会在内存中创建一个新的 String 实例,我应该出于安全考虑而试图避免这种情况?

最佳答案

I've read that for passwords, it's more ideal to use char[] since Strings are immutable.

这不是(全部)原因。实际推理是:

  1. 您正在使用密码来保证安全。

  2. 坏人可能能够获取正在运行的 JVM 的内存转储……或者从保存(或保存)JVM 内存页的磁盘 block 中提取部分转储。该转储可能包含明文密码。

  3. 为了缓解这种情况,可以(应该)在不再需要密码时覆盖包含密码的内存。

  4. 很难覆盖 String,因为它是不可变的。

但如果您检查其中的每一点,就会发现一些假设可能会受到质疑。

  1. 密码不是实现安全性的好方法。对于高级安全性,您应该使用公钥/私钥或 key 身份验证。因此,要么您正在谈论对您的系统“不太重要”的密码……要么您遇到的问题比您在此处尝试解决的问题更大。

  2. 如果坏人可以读取 JVM 内存或页面文件,那么他们已经深入到您的基础设施中了。你已经致命地妥协了。此外,如果他们陷得这么深,他们很可能会找到其他方法来窃取密码;例如窃取您的 SSL 证书的私钥并窥探/解码加密的网络流量。

  3. 这只是一种缓解措施:

    • 密码将在 char[] 中以明文形式保存一段时间。
    • 在密码到达您的代码之前,它们很可能已被 servlet 堆栈(或您使用的任何框架)转换为 String 对象。
    • 此外,只有当您在使用代码后确实覆盖char[] 的内容时,此缓解措施才有效。
  4. 其实如果你真的很担心这个,用反射来删除一个String是可以的;即改变一个 String 对象。一般来说,这是一件危险的事情。对于密码/密码检查,这可能是可以接受的。

简而言之,我认为使用 char[] 而不是 String 在 Java 中实现太昂贵了....除非你准备好完全重新 -设计您的 Web 框架。此外,鉴于具有深度访问权限的人可以通过其他方式窃取密码,这样做的好处值得商榷。


现在回答您的具体问题:

Is it safe to do .add("password", new String(password))

如果您认为使用 String 作为密码存在风险,那么该代码就无济于事了。事实上,假设 password 是一个 String,您现在在内存中有两个包含密码文本的 String 对象。

  • 如果您使用的 API 要求您以 String 形式提供密码,那么您就有问题了。

  • 如果密码的来源(即您如何从用户界面、servlet 框架等获取密码)是一个String,那么您就有问题了。

  • 这两种情况都需要重新设计与您交互的代码的各个方面以解决问题。这可能很困难。

和:

I know it's probably bad that the web api is just accepting a password as it is instead of accepting a base64 version or whatever.

Base64 不会让坏人慢下来超过一分钟左右。任何可逆编码均是如此。但我希望您坚持只能通过 SSL/TLS 安全连接发送密码。

关于java - 为了安全起见,将 new String(char[]) 作为密码参数传递给只接受字符串作为参数的方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com