Sha*_*haz 5 java encryption logging
我会先提出这个问题:
Java中是否有可用于加密的记录器(最好是128位AES或更好)?
在过去的几天里,我做了很多搜索.我发现了一些共同的主题:
最后一点,这对我的项目来说几乎没有实际意义.我们还使用代码混淆器,并可以使用其他混淆技术.使用加密的目的只是为了提高我们的日志"非常简单"的标准,即使它只是"温和耗时".稍微相关一点 - 我们要加密的日志记录仅用于alpha/beta,并且可能只包括调试,警告和日志记录的错误级别(因此要加密的消息数量应该相当低) .
我在Log4j2中找到的最好的是他们的文档:
KeyProviders
Log4j中的某些组件可以提供执行数据加密的能力.这些组件需要密钥才能执行加密.应用程序可以通过创建实现
SecretKeyProvider
接口的类来提供密钥.
但是,除了"插件能够进行加密"之外,我还没有找到任何其他细节.我还没有找到实际具有该功能的插件.
我也刚刚开始尝试为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");
}
}
Run Code Online (Sandbox Code Playgroud)
加密的方面(在本例中仅编辑文本)
@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";
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
[main] INFO xxx.Main - Hello World 加密
[main] INFO xxx.Main - Hello World 2 加密
归档时间: |
|
查看次数: |
2554 次 |
最近记录: |