gpt4 book ai didi

java - Java的加密记录器

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:55 24 4
gpt4 key购买 nike

我先提出问题:

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

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

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

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

我找到的最好的 Log4j2 是在他们的 documentation 中:

KeyProviders

Some components within Log4j may provide the ability to perform data encryption. These components require a secret key to perform the encryption. Applications may provide the key by creating a class that implements the SecretKeyProvider interface.

但是除了“插件能够进行加密”这样的简短陈述之外,我还没有真正发现任何其他内容。我还没有找到真正具有该功能的插件。

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

最佳答案

基本上日志加密不是最佳实践,在有限的情况下您可能需要此功能。由于主要是有权访问日志的人也可以访问 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 encrypted

[main] INFO xxx.Main - Hello World 2 encrypted

关于java - Java的加密记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28154960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com