我正在使用 logback 的 DBAppender 将我的日志存储到 oracle 数据库中。我还想通过加密和解密我的密码来增加我的登录凭据的安全性。所以我被推荐了一个 java 库jasypt。我有几个问题,我也无法访问http://jasypt.org/ 。
- 我可以使用 jasypt 加密 logback.xml 的 DBAppender 数据库凭据吗?
- 另一端(Oracle 数据库)如何解密?
我正在使用 logback 的 DBAppender 将我的日志存储到 oracle 数据库中。我还想通过加密和解密我的密码来增加我的登录凭据的安全性。所以我被推荐了一个 java 库jasypt。我有几个问题,我也无法访问http://jasypt.org/ 。
这是一个较晚的答案,并未涵盖所有问题。但我想分享我的解决方案,以防其他人在这里绊倒。至于我,我使用 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 密码和加密值,那么每次加密都是无用的。任何人都可以通过谷歌搜索来解密它。
你可以参考custom-environment,作者提供了一种解决方案来解决这个问题(在应用程序运行之前解密spring属性)
new SpringApplicationBuilder()
.environment(new StandardEncryptableEnvironment())
.sources(YourApplicationClass.class).run(args);