Проверяет знание методов защиты конфиденциальной информации при логировании.
Использовать библиотеки (например, Logback с кастомными масками).
Регулярные выражения для замены данных (например, \d{16} → ****-****-****-****).
Аннотации (@SensitiveData) для автоматического маскирования.
Пример конфигурации logback.xml:
<configuration>
<conversionRule conversionWord="mask" converterClass="com.example.MaskConverter" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %mask(%msg)</pattern>
</encoder>
</appender>
</configuration>Класс MaskConverter:
public class MaskConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent event) {
return event.getMessage()
.replaceAll("\\b\\d{4}-\\d{4}-\\d{4}-\\d{4}\\b", "****-****-****-****"); // Маскирование карт
}
}String log = "User card: 1234-5678-9012-3456";
String masked = log.replaceAll("\\b\\d{4}(-\\d{4}){3}\\b", "****-****-****-****");
// Результат: "User card: ****-****-****-****"public class UserDTO {
@SensitiveData
private String password;
// Геттеры/сеттеры
}Логика маскирования (например, через AOP):
@Around("execution(* com.example.service.*.*(..))")
public Object maskSensitiveData(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = joinPoint.proceed();
if (result instanceof UserDTO) {
((UserDTO) result).setPassword("******");
}
return result;
}Вывод:
Для простых случаев: Регулярные выражения.
Для enterprise-решений: Кастомные конвертеры логов + AOP.