Java加密记录器

Java加密记录器,java,logging,encryption,Java,Logging,Encryption,我会先提出这个问题: Java中是否有进行加密的记录器(最好是128位AES或更好) 在过去的几天里,我做了很多搜索。我的发现有几个共同的主题: 剖析log4j和log4j2之间的信息让我头疼(但大多与手头的任务无关) 大多数线程都有日期,包括这里的线程。这可能是我在网上找到的最好的答案了,其中一个更新的答案链接到了 最常见的答案是“自己滚”,但这些答案在这一点上也有几年的历史了 很多人质疑我或其他人为什么要用Java来做这件事,因为即使没有源代码,它也足够简单来分析Java代码 最后一点,

我会先提出这个问题:

Java中是否有进行加密的记录器(最好是128位AES或更好)

在过去的几天里,我做了很多搜索。我的发现有几个共同的主题:

  • 剖析log4j和log4j2之间的信息让我头疼(但大多与手头的任务无关)
  • 大多数线程都有日期,包括这里的线程。这可能是我在网上找到的最好的答案了,其中一个更新的答案链接到了
  • 最常见的答案是“自己滚”,但这些答案在这一点上也有几年的历史了
  • 很多人质疑我或其他人为什么要用Java来做这件事,因为即使没有源代码,它也足够简单来分析Java代码
最后一点,对于我的项目来说,这几乎是一个没有实际意义的问题。我们还使用代码混淆器,并可以使用其他混淆技术。使用加密的目的仅仅是将计算日志的门槛提高到“非常简单”,即使只是提高到“稍微耗时”。一个稍微相关的旁白——我们将要加密的日志类型仅适用于alpha/beta,并且可能只包括日志的调试、警告和错误级别(因此要加密的消息数量应该相当低)

我发现Log4j2最好的功能是:

密钥提供者

Log4j中的一些组件可以提供执行数据加密的能力。这些组件需要密钥来执行加密。应用程序可以通过创建实现
SecretKeyProvider
接口的类来提供密钥

但除了“插件可以进行加密”这句话之外,我还没有发现其他东西。我还没有找到一个真正具有这种功能的插件


我也刚刚开始尝试寻找其他的Java日志记录器,看看他们是否实现了一个,但是没有什么东西像“Java日志加密”这样的搜索

基本上,日志加密不是最佳做法。在有限的情况下,您可能需要此功能。主要是那些可以访问日志的人也可以访问JVM,在JVM中,所有日志至少都是以字符串的形式生成的,因此,即使您在日志文件或控制台中对它们进行加密,JVM字符串池中也会提供真正的值,因此,如果任何人都需要对您的日志进行黑客攻击,只需查看字符串池即可

但无论如何,如果您需要一种加密日志的方法,并且由于没有通用的方法,我认为最好的方法是使用Aspect J。这对您的源代码的影响最小,您将像以前一样编写代码,但是日志将被加密。下面是一个简单的应用程序代码,它将使用Aspctj、Slf4j作为日志外观、Log4j2作为日志实现对来自所有编译源的所有日志进行加密

记录“Hello World”的简单类

加密的方面(在本例中仅编辑文本)

输出为:

[main]INFO xxx.main-Hello World加密

[main]INFO xxx.main-Hello World 2加密

相关的:
public class Main {

    private static final transient Logger LOG = LoggerFactory
        .getLogger(Main.class);

    public static void main(String[] args) {
        LOG.info("Hello World");
        LOG.info("Hello {0}", "World 2");
    }

}
@Aspect
public class LogEncryptAspect {

    @Around("call(* org.slf4j.Logger.info(..))")
    public Object encryptLog (ProceedingJoinPoint thisJoinPoint) throws Throwable{
         Object[] arguments = thisJoinPoint.getArgs();
         if(arguments[0] instanceof String){
             String encryptedLog = encryptLogMessage ((String) arguments[0], arguments.length > 1 ? Arrays.copyOfRange(arguments, 1, arguments.length) : null);
            arguments[0] = encryptedLog;
         }
            
        return thisJoinPoint.proceed(arguments);
    }
    // TODO change this to apply some kind of encryption    
    public final String encryptLogMessage (String message, Object... args){
        if(args != null){
            return MessageFormat.format(message, args) + " encrypted";
        }
        return message + " encrypted";
    }

}