Как получить пароль из объекта java.sql.Connection

#java #mysql #jdbc

#java #mysql #jdbc

Вопрос:

Я ищу способ получить пароль из объекта java.sql.Connection. Я знаю, что в объекте DatabaseMetaData есть метод GetUserName(), но, к сожалению, нет соответствующего метода getPassword(). Используя отладчик в Netbeans, я вижу поле для пароля, поэтому должен быть способ получить эту информацию с помощью отражения, но пока я не смог выяснить, как.

Комментарии:

1. Это будет интересно. Я не думаю, что это возможно через общедоступный API, как вы правильно указали. Возможно, где-нибудь в реализации драйвера или DriverManager, если это с открытым исходным кодом, вы можете узнать. Я сомневаюсь, что это в соединении.

2. Это одно из самых странных требований, которые я когда-либо видел. Кроме того, это может привести к нарушению безопасности.

3. итак, если вы видели это поле в отладчике, почему вы не можете получить его с помощью отражения?

4. java.sql.Connection является интерфейсом и не имеет «поля для пароля» или каких-либо других (нестатических) полей.

5. @Gillman Я думаю, нам всем следовало начать с этого вопроса: почему, черт возьми, вы не знаете пароль от соединений, которые используете?

Ответ №1:

Как я прокомментировал, единственным способом должен быть просмотр кода. Например, для MySQL используется последняя версия драйвера (5.1.15). Вы можете получить пароль следующим образом:

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

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

   con.close();
}
  

Но для этого вам нужно будет знать иерархию классов и детали ее реализации.

Другие базы данных, скорее всего, будут отличаться. Если ваша база данных с открытым исходным кодом, например MySQL, вы можете узнать подробности внутренней конструкции и найти способы получения пароля.

Комментарии:

1. Это работает очень хорошо и намного лучше, чем путь отражения, по которому я шел.

Ответ №2:

Это зависит от разработчика 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() {

   ....
  }
}
  

Ответ №3:

Вы можете проанализировать файл конфигурации sever XML для параметров пула соединений и получить пароль оттуда. сложное решение, но оно работает.