¿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.
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:
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.
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 archivologging.properties
:En esta configuración, el registro solo registrará mensajes con un nivel de
WARNING
o superior. La propiedadjavalogspassword.filter
está configurada con una clase personalizadacom.example.PasswordFilter
, que elimina cualquier información sensible de los mensajes de registro.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.