Java的加密记录器

时间:2015-01-26 17:00:29

标签: java logging encryption

我会提前提出这个问题:

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

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

  • 在log4j和log4j2之间解析信息让我感到头痛(但与手头的任务无关)
  • 大多数主题都已过时,包括SO上的主题。 This one可能是我在SO上找到的最好的,其中一个较新的答案链接到roll-your-own version
  • 最常见的答案是"滚动你自己",但这些答案在这一点上还有几年的历史。
  • 很多人质疑为什么我或任何人都会用Java来做这件事,因为它很简单,即使没有源代码也可以分析Java代码。

最后一点,对我的项目来说,这几乎没有实际意义。我们还使用代码混淆器,并可以使用其他混淆技术。使用加密的目的只是为了提高我们记录上面的日志的条件,即使它只是提升到"温和耗时的#34;。稍微相关一点 - 我们要加密的日志记录仅用于alpha / beta,并且可能只包括调试,警告和错误级别的日志记录(因此要加密的消息数量应该相当低)。

为Log4j2找到的最好的是documentation

  

KeyProviders

     

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

但我还没有真正发现除了插件之外的任何声明之外的其他任何内容都可以进行加密#。我还没有找到一个实际上具有这种功能的插件。

我也刚刚开始尝试为Java找到其他记录器,看看他们是否有一个实现,但没有什么真正跳出来搜索像#java logging encryption'。

1 个答案:

答案 0 :(得分: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加密