有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java安全/加密log4j文件

我有个问题安全性要求我有一个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>

简单的课堂测试

http://www.javaworld.com/article/2075817/core-java/customized-appender-extending-org-apache-log4j-fileappender.html

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


共 (1) 个答案

  1. # 1 楼答案

    解决这个问题的一个可能方法是将日志写入支持加密的嵌入式数据库,例如H2本机支持加密,而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找到


    SQLite有一个official加密扩展以及at least one第三方开源扩展;我从来没有对SQLite进行过加密,但如果必须这样做,我会使用官方扩展,除非遇到问题


    如果你在客户端上运行这个程序,那么理想情况下,你可以在启动时让程序phone回家,以获取数据库加密密钥,这样密钥就不会存在于客户端的磁盘驱动器上(忽略它进入交换文件的可能性)——客户端仍然可以使用调试器或其他任何工具来尝试将密钥从内存中取出,但他们可能对解密日志没有足够的兴趣,因此不会有那么大的麻烦。如果你必须将密钥存储在客户端,那么你至少可以在使用它之前对其进行多次哈希处理,例如在程序中对base_密钥进行硬编码,然后在启动时通过多次运行base_key到SHA512(或其他)来创建实际的_密钥;客户机仍然可以通过使用调试器来了解您正在做什么,但他们希望他们不会再有麻烦了