gpt4 book ai didi

java - 从 JVM 堆中消除密码

转载 作者:行者123 更新时间:2023-12-01 23:54:40 24 4
gpt4 key购买 nike

关于如何在 Java 代码中管理密码有各种问题和解答 - 例如 herehere

讨论往往集中在使用 char[] 相对于 String 的优点。

但是,如果第三方库将密码存储在字符串中,是否有任何方法可以避免将密码存储在 JVM 堆中?

例如,在以下三种情况下,我认为密码将在 JVM 的生命周期内保留在堆中:

Hikari 连接池 3.4

编辑 - 更新示例以与我的问题更相关:

// some values read in from a properties file, or similar:
String url = ...;
String user = ...;
String pw = ... ;
...
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(url);
ds.setUsername(user);
ds.setPassword(pw);
...

在上面的示例中,我的 com.zaxxer.hikari.HikariDataSource 对象在 String 中包含密码。我找不到在不丢失连接池的情况下清空数据源的方法。

Jetty 9.4 数据库适配器

例如,如果我创建一个 JDBCSessionDataStoreFactory,则 org.eclipse.jetty.server.session.DatabaseAdaptor 会保留连接凭据,包括密码一个字符串

Tomcat 9 中的 JNDI 连接

在这种情况下,密码可以在 org.apache.tomcat.util.descriptor.web.ContextResource 中找到,也可以在 org.apache.tomcat.dbcp.dbcp2.BasicDataSource 中找到,如果我也选择使用该连接池。

换句话说,敏感连接信息可以在 JVM 堆中的各个位置找到,无论我如何努力在代码中使用 char 数组并在不再需要时覆盖/清空敏感数据。我并不是说我的努力白费了 - 我仍然想保护我能保护的东西(例如用户的登录凭据)。但其他凭据(例如数据库连接)似乎超出了我的控制范围。

针对这些情况有什么解决方案或最佳实践吗?

最佳答案

就像 @Holger 在评论中所说的那样,任何可以读取堆内存和/或文件系统中的堆转储的东西都已经控制了服务器,因此尝试隐藏密码在此时是无用的。最好致力于保护实际服务器和其中的服务。

Thomas Porning 在下面的链接中给出了很好的答案,但这是关键段落(突出显示我的):

None of this applies to a server application, or to client code that handles secrets with an actual non-negligible value. If a malicious attacker is in position to scan the RAM for sensitive data, and that data is worth 1 or 2 minutes of explicit attention from the human attacker, then no amount of overwriting will save you. Thus, in many contexts where security matters, overwriting of passwords and keys is just wasted effort, that gives a feeling of security, but does not actually improves things (though it may be convenient to awe auditors).

https://security.stackexchange.com/a/75891/4667

关于java - 从 JVM 堆中消除密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59548500/

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