通过 Java 中的内存转储减少凭据泄漏

Mitigate credential leaks via memory dumps in Java

我们都知道Java中的passwords/credentials要存储为char数组。它是缓解,而不是保护。

我总是保持我的凭据不使用不可变 objects 但迟早我需要将它传递给一些 class 需要字符串(来自我们使用的所有第三个库)。那不是所有的努力都白费了吗? 例如:如果我想设置授权 header,header 值被 org.apache.http.message.BasicHeader class 存储为字符串。 另一个例子(可能不太好):我使用处理密码的服务(存储它们或其他东西)。它要求它们作为 POST 请求中的 body。我创建 HttpPost 并将 StringEntity 添加为 body。它已经存储为字符串,可以再次转储。

您是否设法让您的凭据相对安全地避免内存转储?

谢谢

在联系了该领域的一些安全专家后,我得到了以下答案:

  1. 将凭据作为 char[] 存储在 Java 中是第二道防线。第一个是不允许他们进行内存转储。
  2. 如果通过了第一级,我们可以减少他们在内存中找到的凭据数量。
  3. 如今不使用第三方库几乎是不可能的。但是,在我的所有示例中,第 3 方库都会在短时间内引用我的密码。他们将其存储为 String 的事实并不意味着我们不应该正确存储它。我们必须致力于不将凭据存储为字符串,尤其是在缓存或其他长时间保留对该对象的引用的地方。