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

Rig*_*nto 3 java security string passwords

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

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

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

题:

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

Ste*_*n C 5

我读过的密码,这是比较理想的在使用char[],因为Strings是不可变的。

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

  1. 您正在使用密码进行安全保护。

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

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

  4. String由于a 是不可变的,因此很难覆盖它。

但是,如果您检查所有这些点,则可能会质疑一些假设。

  1. 密码不是实现安全性的好方法。为了获得较高的安全性,您应该使用公用/专用密钥或秘密密钥身份验证。因此,或者您谈论的是对系统“不太重要”的密码...或者您遇到的问题比您尝试在此处解决的问题更大。

  2. 如果坏人可以读取JVM内存或页面文件,则它们已深入您的基础结构中。您已经受到致命伤害。此外,如果他们深入到此,他们很可能会找到其他方法来窃取密码。例如,窃取您的SSL Cert私钥并监听/解码加密的网络流量。

  3. 这只是缓解措施:

    • 密码会在char[]一段时间内以明文形式存在。
    • 在密码到达您的代码之前,它们很可能已被Stringservlet堆栈(或您使用的任何框架)转换为对象。
    • 此外,如果你这个缓解是唯一有效的覆盖char[]在你的代码。
  4. 实际上,如果您真的对此感到担心,则可以使用反射来擦除String。即变异一个String物体。通常,这是一件危险的事情。对于密码/密码检查,这可能是可以接受的。

简而言之,我会争辩说,除非您准备完全重新设计Web框架,否则使用Java char[]而不是StringJava来实现它太昂贵了。此外,考虑到具有深度访问权限的人可以窃取密码的其他方式,这样做值得商benefit。


现在到您的特定问题:

安全吗 .add("password", new String(password))

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

  • 如果您使用的API要求您提供密码,因为String您遇到问题。

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

  • 在这两种情况下,都必须对与之交互的代码的各个方面进行重新处理以解决问题。这可能很困难。

和:

我知道Web API仅接受原样的密码而不是接受base64版本或其他内容可能很不好。

Base64不会使坏人减速超过一分钟左右。同上可逆编码。但我希望您坚持要求密码只能通过SSL / TLS安全连接发送。

  • 如果您在用户桌面上输入密码时依赖于密码安全性,那么更大的问题是坏人可能已经侵入了用户的计算机并安装了键盘记录器。这比尝试破坏运行客户端的 JVM 容易得多。 (3认同)
  • 最优解?我认为在这种情况下,您可能需要接受这样的事实:如果用户的桌面不安全,则没有任何解决方案是值得的。为了实现目标,您首先需要保护运行客户端的平台。但另一方面,一旦您保证了平台的安全(并培训了用户如何保证其安全),您对 JVM 内存被掠夺的担忧就基本上没有意义了。 (3认同)