2015-01-26 30 views
5

metterò alla domanda iniziale:logger crittografata per Java

Esiste un logger disponibili in Java che fa la crittografia (preferibilmente a 128 bit AES o superiore)?

Ho fatto un sacco di ricerche per questo negli ultimi due giorni. Ci sono alcuni temi comuni a quello che ho trovato:

  • dissezione informazioni tra log4j e log4j2 mi sta dando il mal di testa (ma soprattutto estranei al compito a portata di mano)
  • La maggior parte delle discussioni sono datati, compresi quelli qui su SO. This one è probabilmente il migliore che ho trovato su SO e uno dei più recenti risponde a uno roll-your-own version.
  • La risposta più comune è "roll-your-own", ma a questo punto anche queste risposte hanno alcuni anni.
  • Un sacco di persone si chiedono perché io o chiunque lo farei comunque in Java, dal momento che è abbastanza semplice analizzare il codice Java anche senza la fonte.

Per l'ultimo punto, è praticamente un punto controverso per il mio progetto. Usiamo anche un codice offuscatore e potremmo utilizzare altre tecniche di offuscamento. Il punto di utilizzo della crittografia è semplicemente quello di alzare l'asticella di capire i nostri registri sopra "banalmente facile", anche se è solo aumentato a "leggermente dispendioso". Un aspetto leggermente rilevante: il tipo di registrazione che stiamo per crittografare è inteso solo per alpha/beta e probabilmente includerà solo i livelli di debug, di avviso e di errore (quindi il numero di messaggi da crittografare dovrebbe essere abbastanza basso) .

Il migliore che ho trovato per Log4j2 è nel loro documentation:

KeyProviders

Alcuni componenti all'interno Log4j possono fornire la possibilità di eseguire la crittografia dei dati. Questi componenti richiedono una chiave segreta per eseguire la crittografia. Le applicazioni possono fornire la chiave creando una classe che implementa l'interfaccia SecretKeyProvider.

Ma in realtà non ho trovato altro che affermazioni spettrali sulla falsariga di "plug-in in grado di eseguire la crittografia". Non ho trovato un plug-in che abbia effettivamente questa capacità.

Ho anche appena iniziato a cercare altri logger per Java per vedere se ne sono stati implementati uno, ma nulla è davvero saltato fuori per ricerche come "java logging encryption".

+1

correlati: http://stackoverflow.com/questions/6608529/how-to-use-cipheroutputstream-correctly-to-encrypt-and-decrypt- log-created-con –

risposta

1

Fondamentalmente la crittografia dei registri non è la migliore pratica, ci sono situazioni limitate in cui è possibile avere bisogno di questa funzionalità. Poiché principalmente le persone che hanno accesso ai log hanno anche accesso a JVM e in JVM tutti i log sono almeno generati come stringhe, quindi anche se li crittografi nel file di log o console i valori reali saranno disponibili in JVM String Pool, quindi se qualcuno avrà bisogno di hackerare i tuoi log sarà facile come avere un look in un pool di stringhe.

Ma comunque, se avete bisogno di un modo per crittografare i registri, e in quanto non v'è alcun modo generico per questo, il modo migliore a mio parere è di andare con Aspect J. Questo avrà un impatto minimo su di voi fonti, sarà scrivi il codice come hai fatto prima, ma i log saranno crittografati. Di seguito è riportato un semplice codice dell'applicazione che crittograferà tutti i registri da tutte le origini compilate utilizzando Aspctj e Slf4j come facciata di registrazione e Log4j2 come implementazione di registrazione.

La semplice classe che registra il "Ciao Mondo"

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 che cripta (in questo caso solo le modifiche al testo)

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

} 

L'output è:

[main] INFO xxx.Main - Hello World crittografato

[principale] INFO xxx.Main - Ciao a 2 criptato

Problemi correlati