我们都知道Java中的密码/凭据应该存储为char数组。它的缓解,而不是保护。
我总是保留我的凭据,不使用不可变的对象,但迟早我需要将其传递给某个需要 String 的类(来自我们使用的所有第 3 个库(。那不是所有的精力都没了吗? 例如:如果我想设置授权标头,标头值由org.apache.http.message.BasicHeader类存储为String。 另一个例子(可能不是那么好(:我使用处理密码的服务(存储密码或其他东西(。它要求它们作为 POST 请求中的正文。我创建了HttpPost并将StringEntity添加为正文。它已经存储为字符串,可以再次转储。
您是否设法使您的凭据相对安全,免受内存转储的影响?
谢谢
在联系了该领域的一些安全专家后,我得到了以下答案:
- 在 Java 中将凭据存储为 char[] 是第二级防御。第一个是不允许他们进行内存转储。
- 如果通过第一级,我们可以减少他们在内存中找到的凭据数量。
- 如今,不使用第三方库几乎是不可能的。但是,在我的所有示例中,第三方库都会在短时间内引用我的密码。他们将其存储为字符串的事实并不意味着我们不应该正确存储它。我们必须致力于不将凭据存储为字符串,尤其是在缓存或其他长时间保留对该对象的引用的地方。