feat: добавление STRICT режима (более строгий MASKED)

This commit is contained in:
Максименко Никита Владимирович
2026-09-23 18:20:54 +03:00
parent 5f77971a1c
commit 4bdb03341b
5 changed files with 34 additions and 5 deletions
@@ -158,10 +158,6 @@ public class Pipeline {
recordLatency("mask", policy.name(), started);
logFindings(policy.name(), payloadId, payload.length(), spans);
// Только для отладки формата входных данных на DEBUG — на INFO не активен.
// На боевом прогоне (нагрузочное тестирование) уровень DEBUG должен быть выключен:
// сюда попадают сырые ПД, что напрямую нарушает требование ТЗ не логировать значения.
LOG.debug("payload_id={} raw={}", payloadId, payload);
return masked;
}
@@ -6,6 +6,15 @@ public enum MaskMode {
/** Звёздочки с сохранением длины и разделителей: {@code 45** ****56}. */
MASK,
/**
* Звёздочки без исключений: каждый тип закрывается целиком, даже те, что в
* {@link #MASK} частично открыты (края номера) или превращаются в инициалы
* (ФИО {@code Иванов Иван Иванович} → {@code ******* **** *********}, не
* {@code И. И. И.} — инициалы всё ещё выдают число слов и первую букву
* каждого).
*/
STRICT,
/** Порядковый токен: {@code [FIO_1]}. Компактно и однозначно обратимо. */
TOKEN,
@@ -75,6 +75,9 @@ public class Masker {
public String mask(String type, String value, MaskMode mode, MaskContext context) {
return switch (mode) {
case MASK -> BY_TYPE.getOrDefault(type, Strategies::stars).apply(value);
// STRICT игнорирует BY_TYPE целиком — ни один тип не открывает края
// и ФИО не превращается в инициалы, только сплошные звёздочки.
case STRICT -> Strategies.stars(value);
case TOKEN -> context.resolve(type, value, (t, n) -> "[" + t + "_" + n + "]");
case SYNTHETIC -> context.resolve(type, value, (t, n) -> Synthetic.forType(t, value, n));
};