es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo evitar el registro de información sensible de excepciones de Java?

Las trazas de pila de Java pueden contener información sensible (en mi caso, contraseñas), si la traza de pila completa se registra en un marco de registro (aquí, Java Util Logging).

¿Cómo evitar el registro de dicha información sensible sin perder otra información importante de la traza de pila en los archivos de registro?

Ejemplo:

paquete javalogspassword;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JavaLogsPassword {

    private static final Logger LOG = Logger.getLogger(JavaLogsPassword.class.getName());

    public static void main(String[] args) {
        Connection conn;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" + "user=root&password=");
            LOG.log(Level.FINER, "Conectado");
            try (Statement statement = conn.createStatement()) {
                // esta declaración contiene un error de sintaxis
                statement.execute("ALTER USER test IDENT BY '*Elija-una-buena-contraseña*'");
            }
            conn.close();
        } catch (SQLException ex) {
            // se registrará la contraseña *'Elija-una-buena-contraseña'*
            LOG.throwing(JavaLogsPassword.class.getName(), "main", ex);
        }
    }
}

Configuración del registro: logging.properties:

handlers= java.util.logging.FileHandler
.level= INFO
java.util.logging.FileHandler.pattern = java%u.log
javalogspassword.level = FINER

Comando para ejecutar el archivo jar:

java -Djava.util.logging.config.file=logging.properties -jar dist/JavaLogsPassword.jar

El archivo resultante java0.log contiene la contraseña.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para evitar registrar información sensible como contraseñas en los stacktraces Java sin perder otra información importante del stacktrace en los archivos de registro, puede hacer lo siguiente:

    1. Utilice un marco de registro que le permita personalizar el formato de los mensajes de registro. Esto le permite controlar qué información se incluye en los mensajes de registro y cómo se formatea.
    2. Personalice el registro para evitar que se registre información sensible. Puede utilizar filtros de expresiones regulares para eliminar contraseñas y otra información sensible del stacktrace antes de registrarlo. Esto se puede hacer configurando el registro para registrar solo información específica que sea necesaria para fines de depuración.

    3. Utilice un mecanismo de almacenamiento seguro de contraseñas, como un administrador de contraseñas. Esto reduce el riesgo de exponer contraseñas a través de archivos de registro. Almacenar contraseñas en texto plano o en forma encriptada fácilmente reversible en un archivo de registro no es seguro.

    En el código de ejemplo anterior, puede modificar la configuración del registro para registrar solo el mensaje de excepción en lugar del stacktrace completo. Esto se puede hacer configurando el nivel del registro en WARNING y agregando un filtro personalizado para eliminar cualquier información sensible. Aquí hay un ejemplo de cómo modificar el archivo logging.properties:

    handlers= java.util.logging.FileHandler
    .level= WARNING
    java.util.logging.FileHandler.pattern = java%u.log
    javalogspassword.level = FINEST
    javalogspassword.filter = com.example.PasswordFilter
    

    En esta configuración, el registro solo registrará mensajes con un nivel de WARNING o superior. La propiedad javalogspassword.filter está configurada con una clase personalizada com.example.PasswordFilter, que elimina cualquier información sensible de los mensajes de registro.

    package com.example;
    
    import java.util.logging.Filter;
    import java.util.logging.LogRecord;
    
    public class PasswordFilter implements Filter {
    
        @Override
        public boolean isLoggable(LogRecord record) {
            if (record.getMessage().contains("password=")) {
                record.setMessage(record.getMessage().replaceAll("password=.*?(\\s|$)", "password=*** "));
            }
            return true;
        }
    }
    

    Este filtro reemplaza la contraseña con asteriscos (*) en el mensaje de registro. Con esta configuración, los archivos de registro no contendrán información sensible y aún proporcionarán la información necesaria para fines de depuración.

Comments are closed.