Маскируем чувствительные данные при отправке в ИИ‑чат. Бесплатное приложение

от автора

ИИ‑чаты стали рабочим инструментом наравне с почтой — а вместе с ними появился новый канал утечек, которого три года назад не существовало. Договоры, резюме, пароли и клиентские данные уезжают на чужие серверы не через взлом, а через обычное поле ввода. Блокировать доступ пробовали многие — люди просто уходят на личные устройства, и риск становится невидимым.

Мы решили задачу иначе: расширение для браузера, которое перед отправкой заменяет чувствительные данные обезличенными метками, а ответ ИИ расшифровывает обратно — прямо на экране, незаметно для человека.

В статье расскажу, какие подходы мы перепробовали и почему они не сработали, как выглядит путь пользователя и что у решения под капотом — от контрольных сумм до локального распознавания сканов.

С чего всё началось

Проблема типовая, и она есть в любой организации, где ИИ не заблокирован (а часто и там, где заблокирован — просто с личных телефонов). Достаточно представить обычный рабочий день:

  • HR вставляет резюме кандидата целиком — «сделай выжимку». В резюме телефон, почта, дата рождения, иногда паспорт.

  • Юрист загружает договор — «перепиши третий раздел попроще». В договоре реквизиты обеих сторон, счета, подписанты.

  • Бухгалтер кидает табличку — «посчитай среднее по отделам». В табличке фамилии и зарплаты.

  • Айтишник вставляет конфиг, который не заводится, — вместе с паролем от боевой базы, потому что пароль в этом конфиге и лежит.

Никто из них не вредитель. Каждый просто делает свою работу быстрее — и в этом вся коварность: граница «можно/нельзя» в момент вставки не видна. Человек вставил «текст договора», а не «персональные данные третьих лиц».

А дальше происходит то, о чём мало кто задумывается. Всё отправленное остаётся в истории чата на чужом сервере. Попадает в логи провайдера. Иногда — в обучающие выборки. И главное: кнопки «удалить моё сообщение с ваших бэкапов» не существует. Отправленное не возвращается.

Что мы перепробовали

Прежде чем писать своё, мы прошли классический путь. Он короткий, и каждый шаг чему‑то научил.

1. Менять данные руками. Просим людей заменять «Иванова» на «Клиента N» перед отправкой. Аккуратный человек делает так три дня, потом устаёт. А номер счёта в середине таблицы на четыреста строк руками не найдёт и не заменит вообще никто. Отпало.

2. Регулярка в скрипте. Написать поиск телефонов, ИНН и карт — кажется, дело на вечер. Мы честно попробовали, и выяснилось много весёлого:

  • \b в JavaScript не считает кириллицу буквами — «граница слова» в русском тексте просто не работает;

  • любые десять цифр подряд радостно объявляются ИНН, и скрипт кричит на каждый номер накладной;

  • «Иванову Ивану Петровичу» и «Иванов Иван Петрович» — для регулярки два разных человека.

Пару недель такой жизни — и люди отключают защиту, потому что она мешает. Ложные срабатывания убивают доверие быстрее, чем пропуски.

3. Внешние анонимизаторы. Есть сервисы, которые принимают текст по API, находят чувствительное у себя на сервере и возвращают замаскированный вариант. Точность приличная. Но остановитесь на секунду: чтобы данные не утекли в ИИ, мы отправляем их… в другой внешний сервис. Ту же самую проблему мы не решили — мы её переименовали. Плюс задержка на каждый запрос, плюс ещё один договор на обработку персональных данных.

Из этих проб сложились три требования к решению:

  1. Работает само. Не по кнопке — дисциплина не масштабируется.

  2. Работает локально. Данные не покидают компьютер вообще: ни в ИИ, ни «к нам на сервер».

  3. Не мешает. Человек продолжает пользоваться любимым чатом как раньше.

Из этих трёх пунктов расширение для браузера вывелось почти автоматически: оно живёт там же, где живёт проблема, — на вкладке с ИИ‑чатом.

Как это выглядит для человека

Путь пользователя состоит из четырёх шагов, и три из них происходят без его участия:

1. Отправка. Сотрудник пишет сообщение и жмёт «отправить». Расширение перехватывает отправку и за долю секунды проверяет текст.

2. Находки. Если нашлось чувствительное — появляется окно: вот что обнаружено (ФИО, карта, ИНН). Один клик — «Анонимизировать и отправить».

3. Маскирование. Каждое значение получает псевдоним, и на сервер ИИ уходит текст с метками:

  1. // человек написал:"Составь ответ клиенту: Иванов Иван Петрович, карта 2200 2404 0000 0002, почта i.ivanov@mail.ru — оплата прошла дважды"// на сервер ИИ ушло:"Составь ответ клиенту: [user_qhb6tm], карта [card_348zsg], почта [email_p8xw2n] — оплата прошла дважды"

ИИ спокойно работает с такой заготовкой — чтобы составить ответ про двойную оплату, ему не нужен настоящий номер карты. Отвечает он тоже метками: «Уважаемый [user_qhb6tm], возврат по карте [card_348zsg]…».

4. Расшифровка. Расширение на лету подставляет в ответ настоящие значения — но только на экране пользователя. Человек читает нормальный текст с именем и номером, а на сервере ИИ как лежали метки, так и лежат. Словарь соответствий «оригинал ↔ псевдоним» живёт в памяти браузера и умирает вместе с ним.

Для недоверчивых есть режим «Показать псевдонимы» — он снимает расшифровку и показывает ровно то, что физически ушло на сервер. Проверить можно в один клик, не выключая защиту.

Теперь как это устроено внутри

Хабр — площадка техническая, так что немного подробностей. Движок — это набор категорий (сейчас их 33), каждая описана декларативно: шаблоны, валидатор, приоритет, префикс метки:

inn: {  patterns: ['(?<!\\d)\\d{10}(?!\\d)', '(?<!\\d)\\d{12}(?!\\d)'],  postFilter: innChecksum,   // контрольные числа по алгоритму ФНС  prefix: 'inn',  priority: 80}

Три решения, которые в итоге определили качество, — и до каждого мы дошли через грабли.

Валидация вместо угадывания. Совпадение с шаблоном — только кандидат:

  • ИНН проверяется контрольными числами, карта — алгоритмом Луна, СНИЛС и ОГРН — своими суммами. Случайное десятизначное число находкой не станет.

  • С паролями задача обратная — отсеять заглушки: кандидат проходит проверку энтропии и словарь стоп‑значений, чтобы password: password из документации не будил детектор.

Нормализация. Русский язык склоняется. «Иванову Ивану Петровичу» в начале письма и «Иванов Иван Петрович» в конце — один человек, и метку они должны получить одну, иначе ИИ решит, что персонажей двое, и ответ развалится. Поэтому ФИО перед выдачей метки приводится к именительному падежу (род определяется по отчеству).

Толерантный разбор ответа. Сюрприз, которого мы не ждали: модели искажают метки. Возвращают [ORG_T3WNFD] вместо [org_t3wnfd], вставляют пробелы, оборачивают в markdown, а однажды мы поймали кириллическую «о» вместо латинской — гомоглиф, глазами не отличишь. Строгий парсер терял 5 из 11 реалистичных искажений; после того, как разбор стал нечувствительным к регистру, пробелам и гомоглифам — 11 из 11. Даже алфавит меток подчинён этому: шесть символов в Crockford Base32, без букв i, l, o, u — чтобы «i превратилась в 1» разбиралось однозначно.

По скорости всё скучно, и это хорошо:

Что

Сколько

Типовое сообщение

доли миллисекунды

Нагрузочный потолок: 0,9 МБ текста, 45 000 сущностей

~150 мс

Модели/загрузки при старте

нет — движок готов сразу

Интернет

не нужен: отключите сеть — маскирование продолжит работать

Файлы и сканы: где было страшнее всего

Довольно быстро стало ясно, что самое чувствительное уходит в ИИ не сообщениями, а вложениями. Договор — это файл. Табличка — файл. Поэтому расширение проверяет и их:

  • 70+ текстовых форматов — от CSV и JSON до конфигов, .env и дампов почты;

  • docx, xlsx, pptx — обезличенная копия создаётся с сохранением форматирования: таблицы, стили и колонтитулы на месте, заменены только значения. В ИИ уходит договор.anon.docx, который выглядит как оригинал;

  • PDF — текстовый слой проверяется за миллисекунды;

  • сканы и фото документов — распознаются встроенным офлайн‑движком, прямо на компьютере.

Про последний пункт — подробнее, потому что именно тут было страшнее всего. Юристы живут в PDF‑сканах, и сказать им «этот файл мы проверить не можем» означало оставить самую горячую категорию документов без защиты. Распознавать в облаке нельзя по очевидной причине: фото паспорта не должно ездить на чужой сервер даже ради благого дела. Значит — OCR на клиенте.

Когда произносишь «OCR в браузере», собеседник обычно представляет, как ноутбук взлетает вентиляторами и умирает на полчаса. Мы тоже этого боялись, поэтому перед тем как писать код, сели замерять. Реальные цифры с обычного рабочего ноутбука:

Что распознаём

Время

Память (пик)

Скан A4, 200 dpi

1,6 с

+76 МБ

Скриншот 1920×1080

0,9 с

+66 МБ

Фото телефоном 3024×4032

2,0 с

+153 МБ

10 страниц A4 подряд

14,4 с (~1,4 с/стр.)

222 МБ — не растёт от числа страниц

Занято при этом чуть больше одного ядра — распознавание идёт в одном воркере, машина остаётся отзывчивой. Память не накапливается: воркер создаётся под задачу и уничтожается после неё, пик определяется размером одной страницы, а не толщиной документа. Двадцатистраничный скан договора — это примерно полминуты с прогресс‑баром, в течение которых спокойно работаешь в соседней вкладке.

Пара находок из этих же замеров. Уменьшение картинки до 2000 px по длинной стороне оказалось бесплатным выигрышем — быстрее и точнее, потому что модель обучалась на типографских размерах текста. А сканы, сохранённые «боком», спасаются автоповтором с поворотами: плохая страница обходится в семь раз дороже хорошей, но читается — уверенность распознавания на живом тесте выросла с 37 до 94 из 100.

Сравнение с другими расширениями

Ниша браузерных маскировщиков существует, и мы разбирали конкурентов руками — без имён, но по делу:

AI Guard

Другие расширения

Срабатывание

автоматически при отправке

чаще вручную: кнопка или горячая клавиша

Российские идентификаторы (ИНН, СНИЛС, ОГРН, карты)

с проверкой контрольных сумм

обычно нет или «по виду», без валидации

ФИО во всех падежах → одна метка

да

редко

Технические секреты (ключи API, строки подключения, OTP)

да, включая вендорные форматы

как правило нет

Расшифровка ответа на экране

автоматически, с подсветкой

часто отдельным действием

Проверка файлов

70+ форматов; docx/xlsx/pptx с сохранением форматирования

обычно «запретить вложение», реже — за отдельную плату

Сканы и фото (OCR)

локально, офлайн

не встречали ни у кого; в лучшем случае облако

Работа без интернета

да, полностью

иногда докачивают модель при старте

Свои правила и профиль организации

да, без кода

редко

Управление на парк машин (GPO/Intune)

да

редко

Попробовать

Бесплатная версия лежит в Chrome Web Store — вся текстовая защита, 33 категории, свои правила, три режима работы. Версия с файлами, распознаванием сканов и раздачей настроек — по запросу.

И просьба: если найдёте текст, на котором детектор ошибается, — напишите в комментариях. У нас правило: каждый живой дефект заканчивается исправлением и регресс‑тестом. Такие сообщения двигают качество быстрее любых внутренних планов.

ссылка на оригинал статьи https://habr.com/ru/articles/1071398/