如何从java.sql.Connection对象中检索密码

3

我正在寻找一种从java.sql.Connection对象中获取密码的方法。我知道DatabaseMetaData对象中有一个getUserName()方法,但不幸的是没有对应的getPassword()方法。使用Netbeans中的调试器,我可以看到密码的字段,因此必须有一种使用反射获取这些信息的方法,但到目前为止我还无法弄清楚如何做到。


1
这很有趣。我认为通过公共API不可能实现,正如你所指出的那样。也许在驱动程序实现或DriverManager中可以找到,如果它是开源的。我怀疑它是否在连接中。 - Edwin Dalorzo
2
这是我见过的最奇怪的要求之一。此外,它有潜在的安全漏洞。 - Vladimir Dyuzhev
2
所以,如果你在调试器中看到了该字段,为什么不能使用反射获取它呢? - jtahlborn
1
java.sql.Connection 是一个接口,没有“密码字段”,或任何其他(非静态)字段。 - Paul Hanbury
1
@Gillman 我认为我们都应该从这个问题开始:你为什么不知道你正在使用的连接的密码? - Edwin Dalorzo
显示剩余3条评论
3个回答

2

正如我所评论的,唯一的方法就是查看代码。例如,对于使用最新驱动程序(5.1.15)的MySQL,您可以像这样获取密码:

public static void main(String[] args) throws Exception{
  ConnectionImpl con = (ConnectionImpl) DriverManager.getConnection("jdbc:mysql://localhost:3908/mydb?user=edalorzo&password=mandrake");

   System.out.println(con.getProperties().get("password"));

   con.close();
}

但是为了实现这一点,您需要了解类继承结构和其实现细节。

其他数据库很可能会有所不同。如果您使用的数据库是开源的,比如MySQL,您可以了解内部结构的细节并找到检索密码的方法。


这个方法非常有效,比我之前走的反射路径要好得多。 - Gillman

1

由于用户和密码作为Map传递给驱动程序,因此JDBC的实现者负责提供它。

一种了解密码的方式是扩展驱动程序并包含密码。

class CustomDriver extends ImplementerDriver {
  @Override
  public Connection connect(String url, Properties info) throws SQLException {
    super.connect(url, info);
    // Extract password from info.
  }

  public String getPassword() {

   ....
  }
}

0
你可以解析服务器 XML 配置文件,以获取连接池参数,并从中获取密码。这是一个复杂的解决方案,但它有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接