Версия 1.0.0. Правообладатель — ООО «Айти Дев Линк». Библиотека маскирует значения персональных данных в журналах. Она не является средством защиты информации.
1. Что нужно
- Node.js 18 или новее (Windows, Linux, macOS). На российских ОС Node.js ставится из репозитория системы, например
sudo apt install nodejs npm(Astra Linux, ALT) илиsudo dnf install nodejs(РЕД ОС). - Доступ к интернету не требуется. Docker, виртуальные машины, база данных и сервер не нужны. Зависимостей у пакета нет.
2. Установка
Скачайте архив pdn-filter-1.0.0.tgz и выполните в каталоге проекта одну команду:
npm install --offline ./pdn-filter-1.0.0.tgzКоманда ставит библиотеку из локального файла и не обращается к сети.
3. Проверка установки
npx pdn-filter --самопроверкаОжидаемый результат: строки OK и итог «Самопроверка пройдена: 13 из 13.»
4. Быстрый старт
const { mask, createFilter } = require('pdn-filter');
mask('Пациент Иванов Иван Иванович, СНИЛС 112-233-445 95, тел. +7 (916) 123-45-67');
// 'Пациент [ФИО], СНИЛС [СНИЛС], тел. [ТЕЛЕФОН]'
const filter = createFilter({ mode: 'partial' });
filter.mask('СНИЛС 112-233-445 95'); // 'СНИЛС ***-***-*** 95'Объекты: исходный объект не изменяется, значения полей snils, inn, phone, fio и похожих маскируются по имени поля.
filter.maskDeep({ user: { snils: '11223344595' }, note: 'ИНН 7707083893' });
// { user: { snils: '*********95' }, note: 'ИНН ********93' }5. Что находится
| Вид | Метка | Как определяется |
|---|---|---|
| СНИЛС | [СНИЛС] | 11 цифр с верным контрольным числом; с ключевым словом «СНИЛС» — любой |
| ИНН | [ИНН] | 10 или 12 цифр с верной суммой; с ключевым словом «ИНН» — любой |
| ОГРН, ОГРНИП | [ОГРН] | 13 или 15 цифр с верной суммой |
| Полис ОМС (ЕНП) | [ПОЛИС_ОМС] | 16 цифр с верной контрольной цифрой; с ключевым словом «полис», «ОМС», «ЕНП» — любой |
| Паспорт РФ | [ПАСПОРТ] | «4504 123456», «45 04 123456»; слитно (10 цифр) только рядом со словом «паспорт» или «серия» |
| Телефон | [ТЕЛЕФОН] | +7 / 8 / 7 и 10 цифр; без префикса только рядом со словом «тел.» |
| ФИО | [ФИО] | «Фамилия Имя Отчество», «Имя Отчество», «Иванов И.И.», а также после «ФИО:», «пациент» |
| Электронная почта | [EMAIL] | обычный адрес |
Числа проверяются по контрольным суммам, поэтому обычные числа в логах (время, суммы, номера заказов) не искажаются.
6. Настройки
createFilter({
types: ['snils', 'inn', 'phone'], // что искать (по умолчанию всё)
mode: 'label', // label | partial | hash
hashKey: 'секрет', // обязателен для hash: [СНИЛС:3fa9c1d2]
keepDigits: 2, // сколько последних цифр оставлять в partial
strictContext: false, // true — числа ищутся только рядом с ключевыми словами
extraNames: ['Мельник'], // фамилии и имена, которые нужно маскировать всегда
replacer: (type, value) => '***', // полностью своя замена
maskKeys: true, // маскировать по имени поля в объектах
keyRules: { cardholder: 'fio' }, // свои имена полей
});filter.scan(text) возвращает места находок (type, start, end) без самих значений.
7. Подключение к логгерам
const { createFilter, wrapLogger, patchConsole, pinoOptions, winstonFormat, createMaskingStream } = require('pdn-filter');
const filter = createFilter();
const log = wrapLogger(console, filter); // любой логгер с info/warn/error...
const restore = patchConsole(filter); // подменить console, restore() вернёт как было
const logger = pino(pinoOptions(filter)); // pino
winston.format.combine(winstonFormat(filter), winston.format.json()); // winston
process.stdin.pipe(createMaskingStream(filter)).pipe(process.stdout); // поток строкСами pino и winston пакет не устанавливает: адаптеры возвращают обычные объекты настроек.
8. Командная строка
cat app.log | npx pdn-filter --mode partial > app.masked.logПараметры: --mode label|partial|hash, --key, --types snils,inn,..., --strict, --самопроверка, --help.
9. Валидаторы
const { isSnils, isInn, isOgrn, isOgrnip, isEnp, isPassportRf, isPhoneRu, isIcd10 } = require('pdn-filter/validators');
isSnils('112-233-445 95'); // true
isIcd10('J18.9'); // true (проверяется только формат кода)10. Ограничения
- Поиск ФИО эвристический (по отчеству и инициалам), справочников имён нет. Фамилию и имя без отчества пакет находит только после слов «ФИО», «пациент» или из списка
extraNames. Заглавные буквы целиком («ИВАНОВ ИВАН») не распознаются. - Десятизначное число без ключевого слова, прошедшее проверку ИНН, маскируется; исключение — значения в диапазоне Unix-времени 2017–2033 годов. Для строгого режима используйте
strictContext. - Для ЕНП применяется проверка по алгоритму Луна, номера старых образцов полисов не охватываются.
- Пакет обрабатывает уже сформированный текст и объекты. Данные, не попавшие в строки (например, бинарные поля), он не видит.
- Всегда проверяйте результат на своих реальных логах до промышленного использования.
11. Типичные проблемы
| Симптом | Причина | Что сделать |
|---|---|---|
node: команда не найдена | не установлен Node.js | установить пакет из репозитория ОС |
npm ERR! code ENOENT | неверный путь к архиву | запустить команду в каталоге с архивом |
| версия Node.js старее 18 | устаревшая ОС | обновить пакет Node.js из репозитория ОС |
12. Удаление
npm uninstall pdn-filterБиблиотека ставится в каталог node_modules/pdn-filter проекта. Сетевых портов и фоновых служб нет.
Вопросы по установке и использованию принимаются через форму обратной связи.