我有一个问题; 安全 要求 我有 java swing 应用程序,该应用程序具有使用 log4j 生成的日志文件,用于跟踪情况下的支持问题 一个错误。
我必须加密/加密/保护文件,这样客户就无法打开它们并看到它们(至少不是人类可读的方式),同时支持技术团队获取这些文件他们将知道如何阅读(解密)它们。
我做了很多搜索,我尝试了我发现的最佳选择,即通过扩展 SkeletonAppender
构建自定义 appender。
现在知道我有 log4j 像下面的配置一样工作得很好,但是我创建了新的类来加密它,但即使使用简单的设置我也无法让它工作它不会创建文件,所以我可以继续加密部分。
任何帮助,链接都很好。
工作...版本
<appender name="cache" class="com.MyAppender">
<param name="Threshold" value="ALL" />
<param name="ImmediateFlush" value="true" />
<param name="File" value="${home}/logs/cache.log"/>
<param name="Append" value="true"/>
<param name="Threshold" value="ALL" />
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.EnhancedPatternLayout">
<param name="ConversionPattern" value="%-5p %d{MMM-dd-yyyy HH:mm:ss,SSS} %c{1} - %m%n" />
</layout>
</appender>
不工作...版本
<appender name="cache" class="com.MyAppender">
<param name="Threshold" value="ALL" />
<param name="ImmediateFlush" value="true" />
<param name="File" value="${home}/logs/cache.log"/>
<param name="Append" value="true"/>
<param name="Threshold" value="ALL" />
<param name="Encoding" value="UTF-8" />
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern"
value="${home}/logs/cache.%d{yyyy-MM-dd-HH}.gz" />
<param name="ActiveFileName" value="${home}/logs/cache.log" />
</rollingPolicy>
<layout class="org.apache.log4j.EnhancedPatternLayout">
<param name="ConversionPattern"
value="%-5p %d{MMM-dd-yyyy HH:mm:ss,SSS} %c{1} - %m%n" />
</layout>
</appender>
简单的类测试
package com.MyAppender;
import org.apache.log4j.spi.LoggingEvent;
public class MyAppender extends org.apache.log4j.RollingFileAppender {
private String file;
private boolean initialized = false;
private String baseFileName = null;
// private static final Log log = LogFactory.getLog(MyAppender.class);
/**
*
* write to ActivityLog
*
* @param event
* logging event invoked.
*
*/
@Override
protected void subAppend(LoggingEvent event) {
if (!initialized) {
createNewFile();
}
synchronized (this) {
super.subAppend(event);
}
}
/**
*
* create a new ActivityLog File
*
*/
public void createNewFile() {
try {
baseFileName = file;
super.setFile(baseFileName);
super.activateOptions();
initialized = true;
} catch (Exception e) {
// log.error("*#*Error in configuration of log4j params,unable to create ActivityLog file");
}
}
/**
*
* invokes File Appender's activateOptions() which controls the creation of
* log files.
*
*/
@Override
public void activateOptions() {
super.setFile(file);
super.activateOptions();
}
/**
*
* Close and rename the current ActivityLog file and reset counter and
* timestamp.
*
*/
public void rollOver() {
closeFile();
initialized = false;
}
@Override
public void setFile(String file) {
this.file = file;
}
}
然后我打算在 Cipher OutputStream
最佳答案
该问题的一个可能解决方法是将日志写入支持加密的嵌入式数据库,例如H2 native 支持加密和 SQLite具有开源加密扩展 - 这样您就可以只使用 JDBCAppender
并让数据库负责加密,而不必担心自定义附加程序。
来自 this question , SQLite 配置看起来像
<appender name="jdbcAppender" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="URL" value="jdbc:sqlite:D:/download/mapLogic/sf_log.db" />
<param name="user" value="" />
<param name="password" value="" />
<param name="driver" value="org.sqlite.JDBC" />
<param name="sql"
value="INSERT INTO Log(Message,Priority,Logger,Date) VALUES ('%m','%p','%c','%d{ABSOLUTE}')" />
</appender>
你的日志表在哪里
CREATE TABLE Log (
LogId INTEGER PRIMARY KEY,
Date DATETIME NOT NULL,
Level VARCHAR(50) NOT NULL,
Logger VARCHAR(255) NOT NULL,
Message TEXT DEFAULT NULL
);
可以找到有关 JDBCAppender
的文档 here
有一个 official SQLite 的加密扩展以及 at least one第三方开源扩展;我从来没有加密过 SQLite,但如果我必须这样做,那么我会使用官方扩展,除非我遇到问题。
如果您在客户端上运行它,那么理想情况下,您将能够在启动时让程序打电话回家以获取数据库加密 key ,这样 key 就永远不会存在于客户端的磁盘驱动器上(忽略这种可能性它进入交换文件) - 客户端仍然可以使用调试器或其他任何东西来尝试从内存中获取 key ,但大概他们对解密日志没有足够的兴趣来解决那么多的麻烦。如果您必须将 key 存储在客户端,那么您至少可以在使用之前通过多次散列来混淆它,例如在程序中硬编码 base_key,然后在启动时通过 SHA512 运行 base_key 来创建 actual_key (或其他)几次;客户仍然可以通过使用调试器弄清楚你在做什么,但同样希望他们不想惹麻烦。
关于java - 保护/加密 log4j 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215944/