2015-01-26 26 views
5

ich im Vorfeld die Frage gestellt werden:Verschlüsselte Logger für Java

Gibt es einen Logger in Java, die Verschlüsselung funktioniert (vorzugsweise 128-Bit-AES oder besser)?

Ich habe in den letzten paar Tagen viel nach diesem gesucht. Es gibt ein paar gemeinsame Themen zu dem, was ich gefunden habe:

  • Dissecting Informationen zwischen log4j und log4j2 mir Kopfschmerzen schenkt (aber meist in keinem Zusammenhang mit der Aufgabe in der Hand)
  • Die meisten Threads datiert sind, einschließlich der hier auf SO. This one ist wahrscheinlich das Beste, was ich auf SO gefunden habe, und eine der neueren Antworten verweist auf eine roll-your-own version.
  • Die häufigste Antwort ist "roll-your-own", aber diese Antworten sind an dieser Stelle auch ein paar Jahre alt.
  • Viele Leute fragen sich, warum ich oder irgendjemand das in Java sowieso machen würde, da es einfach genug ist, Java-Code auch ohne die Quelle zu analysieren.

Für den letzten Punkt, es ist so ziemlich ein strittiger Punkt für mein Projekt. Wir verwenden auch einen Code-Obfuscator und könnten andere Verschleierungstechniken verwenden. Der Sinn der Verschlüsselung liegt darin, die Messlatte über "trivial einfach" zu stellen, auch wenn sie nur "leicht zeitraubend" ist. Ein wenig relevant beiseite - die Art der Protokollierung, die wir verschlüsseln wollen, ist lediglich für Alpha/Beta gedacht und wird wahrscheinlich nur Debug-, Warn- und Fehlerlevel der Protokollierung enthalten (daher sollte die Anzahl der zu verschlüsselnden Nachrichten ziemlich niedrig sein) .

Das Beste, was ich für Log4j2 gefunden habe, ist in ihrer documentation:

KeyProviders

Einige Komponenten innerhalb Log4j kann die Fähigkeit, eine Datenverschlüsselung bieten. Diese Komponenten benötigen einen geheimen Schlüssel, um die Verschlüsselung durchzuführen. Anwendungen können den Schlüssel bereitstellen, indem sie eine Klasse erstellen, die die Schnittstelle SecretKeyProvider implementiert.

Aber ich habe wirklich nichts anderes gefunden als wispy Aussagen in der Art von "Plug-Ins sind in der Lage, Verschlüsselung zu tun". Ich habe kein Plug-In gefunden, das diese Fähigkeit tatsächlich besitzt.

Ich habe auch gerade angefangen zu versuchen, andere Logger für Java zu finden, um zu sehen, ob sie eine implementiert haben, aber nichts springt wirklich für Suchen wie 'Java-Logging-Verschlüsselung'.

+1

Verwandte: http://stackoverflow.com/questions/6608529/how-to-use-cipheroutputstream-correctly-to-encrypt-and-decrypt- Log-erstellt mit –

Antwort

1

Grundsätzlich ist die Protokollverschlüsselung keine bewährte Methode. Es gibt nur wenige Situationen, in denen Sie diese Funktionalität benötigen. Da hauptsächlich Personen, die Zugriff auf Protokolle haben, auch Zugriff auf JVM haben, werden in JVM alle Protokolle zumindest als Strings generiert. Selbst wenn Sie sie in der Protokolldatei oder Konsole verschlüsseln, sind die tatsächlichen Werte daher in JVM String Pool verfügbar Wenn jemand Ihre Logs hacken muss, ist es so einfach wie im String-Pool.

Aber trotzdem, wenn Sie eine Möglichkeit zum Verschlüsseln der Protokolle benötigen, und da es keine generische Möglichkeit dafür gibt, ist meiner Meinung nach der beste Weg, mit Aspect J zu gehen. Dies wird minimale Auswirkungen auf Ihre Quellen haben schreibe den Code wie zuvor, aber die Logs werden verschlüsselt. Es folgt ein einfacher Anwendungscode, der alle Protokolle aller kompilierten Quellen mithilfe von Aspctj und Slf4j als Protokollfassade und Log4j2 als Protokollimplementierung verschlüsselt.

Die einfache Klasse, die die "Hallo Welt"

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, die verschlüsselt protokolliert (in diesem Fall bearbeitet nur den Text)

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

} 

Die Ausgabe lautet:

[main] INFO xxx.Main - Hallo Welt verschlüsselt

[main] INFO xxx.Main - Hallo Welt 2 verschlüsselt