用于Logback配置的密码加密/解密

问题描述 投票:1回答:2

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

  1. 我可以使用jasypt加密l​​ogback.xml的DBAppender数据库凭据吗?
  2. 如何在另一端(Oracle数据库)完成解密?
java encryption logback jce jasypt
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>

这是示例Connector类:

// 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密码和加密值,那么每次加密都是无用的。任何人都可以通过谷歌搜索来解密它。


0
投票

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

new SpringApplicationBuilder()
    .environment(new StandardEncryptableEnvironment())
    .sources(YourApplicationClass.class).run(args);
© www.soinside.com 2019 - 2024. All rights reserved.