3

我正在使用 logback 的 DBAppender 将我的日志存储到 oracle 数据库中。我还想通过加密和解密我的密码来增加我的登录凭据的安全性。所以我被推荐了一个 java 库jasypt。我有几个问题,我也无法访问http://jasypt.org/

  1. 我可以使用 jasypt 加密 logback.xml 的 DBAppender 数据库凭据吗?
  2. 另一端(Oracle 数据库)如何解密?
4

2 回答 2

1

这是一个较晚的答案,并未涵盖所有问题。但我想分享我的解决方案,以防其他人在这里绊倒。至于我,我使用 LogBack 将日志存储在我的 MySQL 数据库中。我想如果您使用 Oracle 或其他东西,这没有什么区别,因为连接是通过 jdbc 完成的,而解密是通过 jasypt 完成的。我假设你知道如何使用 jdbc 和 jasypt。

这是我的示例 logback.xml:

<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
    </encoder>
</appender>
<appender name="db" class="ch.qos.logback.classic.db.DBAppender">
    // important!! Deliver your own class
    <connectionSource class="com.company.project.Connector">
        <driverClass>com.mysql.jdbc.Driver</driverClass>
        // nothing more to provide here
    </connectionSource>
</appender>

<logger name="com.company" level="ALL"/>

<root level="WARN">
    <appender-ref ref="stdout"/>
    <appender-ref ref="db"/>
</root>

这是示例连接器类:

// Important to extend DriverManagerConnectionSource
public class Connector extends DriverManagerConnectionSource {

  /**
   * Overrides: getConnection() in class DriverManagerConnectionSource
   */
  @Override
  public Connection getConnection() {

    // I am loading the properties from the resources foler
    try (final InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("client.properties")) {
      final EnvironmentPBEConfig       config    = new EnvironmentPBEConfig();
      final StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
      final Properties                 props     = new EncryptableProperties(encryptor);

      props.load(inputStream);
      config.setAlgorithm("<algorithm>");
      config.setPassword("<jasypt encryption password>");
      encryptor.setConfig(config);

      return DriverManager.getConnection(String.format("jdbc:mysql://%s/%s?user=%s&password=%s",
                                                       props.getProperty("<ip>"),
                                                       props.getProperty("<db_name>"),
                                                       props.getProperty("<user>"),
                                                       props.getProperty("<pw>")));
    } catch (IOException | SQLException  e) {
      e.printStackTrace();
    }

    return null;
  }
}

请记住,如果有人得到您的 jasypt 密码和加密值,那么每次加密都是无用的。任何人都可以通过谷歌搜索来解密它。

于 2017-02-25T11:07:59.637 回答
0

你可以参考custom-environment,作者提供了一种解决方案来解决这个问题(在应用程序运行之前解密spring属性)

new SpringApplicationBuilder()
    .environment(new StandardEncryptableEnvironment())
    .sources(YourApplicationClass.class).run(args);
于 2019-04-26T09:31:20.360 回答