我先把问题提出来:
在Java中是否有一个可以进行加密(最好是128位AES或更高版本)的记录器?
在过去的几天里,我做了很多关于这个的研究。我的发现有几个共同的主题:
对于最后一点,对于我的项目来说,这几乎是一个没有意义的问题。我们还使用代码混淆器,并可以使用其他混淆技术。使用加密的目的只是为了提高计算我们的日志的门槛,而不是“简单的”,即使它只是被提高到“稍微费时”。另外,我们要加密的日志类型仅适用于alpha/beta,很可能只包括日志的调试、警告和错误级别(所以要加密的消息数量应该相当少)。
我为Log4j2找到的最好的就是他们的文档
KeyProviders Log4j中的某些组件可能提供执行数据加密的能力。这些组件需要一个秘密密钥来执行加密。应用程序可以通过创建实现
SecretKeyProvider接口的类来提供密钥。
但是我没有发现任何其他的东西,只有像“插件可以加密”这样的小语句。我还没有找到真正具有这种功能的插件。
我也刚刚开始尝试为Java寻找其他记录器,看看它们是否已经实现了,但是没有什么东西真正跳出了像'java日志加密‘这样的搜索。
发布于 2015-01-27 07:54:17
基本上,日志加密并不是最好的实践,在有限的情况下,您可以需要这种功能。主要是访问日志的人也可以访问JVM,而在JVM中,所有日志至少都是以String形式生成的,因此即使您在日志文件或控制台中对它们进行加密,实际值也将在JVM string Pool中可用,因此,如果任何人都需要对您的日志进行黑客攻击,那么就像查看字符串池一样容易。
但是无论如何,如果您需要一种加密日志的方法,而且由于没有通用的方法,我认为最好的方法是使用方面J。这将对您的源产生最小的影响,您将像以前一样编写代码,但是日志将被加密。下面是一个简单的应用程序代码,它将使用Aspctj、Slf4j作为日志外观和Log4j2作为日志实现来加密来自所有编译源的所有日志。
记录"Hello“的简单类
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";
}
}产出如下:
主信息xxx.Main - Hello加密 主信息xxx.Main - Hello 2加密
https://stackoverflow.com/questions/28154960
复制相似问题