【问题标题】:Encrypted logger for JavaJava的加密记录器
【发布时间】:2015-03-25 03:38:24
【问题描述】:

我会提前提出问题:

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

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

  • 在 log4j 和 log4j2 之间剖析信息让我头疼(但大多与手头的任务无关)
  • 大多数主题都已过时,包括 SO 上的主题。 This one 可能是我在 SO 上找到的最好的答案,其中一个较新的答案链接到 roll-your-own version
  • 最常见的答案是“roll-your-own”,但这些答案在这一点上也有几年的历史了。
  • 很多人质疑为什么我或其他人会在 Java 中执行此操作,因为即使没有源代码也很容易分析 Java 代码。

对于最后一点,这对于我的项目来说几乎是一个有争议的问题。我们还使用代码混淆器,并且可以使用其他混淆技术。使用加密的目的只是为了将计算日志的标准提高到“非常容易”之上,即使它只是提高到“稍微耗时”。稍微相关一点 - 我们要加密的日志记录类型仅用于 alpha/beta,并且可能仅包括日志记录的调试、警告和错误级别(因此要加密的消息数量应该相当低) .

我发现的最好的 Log4j2 是在他们的documentation

密钥提供者

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

但除了“插件能够进行加密”之类的纤细陈述之外,我还没有真正找到任何东西。我还没有找到真正具有该功能的插件。

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

【问题讨论】:

标签: java logging encryption


【解决方案1】:

基本上,日志加密不是最佳实践,在有限的情况下您可能需要此功能。因为主要可以访问日志的人也可以访问 JVM,并且在 JVM 中,所有日志至少都生成为字符串,因此即使您在日志文件或控制台中对它们进行加密,实际值也将在 JVM 字符串池中可用,所以如果任何人都需要破解您的日志,这将像查看字符串池一样简单。

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

记录“Hello World”的简单类

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";
    }

}

输出是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多