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

ИИ‑чаты стали рабочим инструментом наравне с почтой — а вместе с ними появился новый канал утечек, которого три года назад не существовало. Договоры, резюме, пароли и клиентские данные уезжают на чужие серверы не через взлом, а через обычное поле ввода. Блокировать доступ пробовали многие — люди просто уходят на личные устройства, и риск становится невидимым.
Мы решили задачу иначе: расширение для браузера, которое перед отправкой заменяет чувствительные данные обезличенными метками, а ответ ИИ расшифровывает обратно — прямо на экране, незаметно для человека.
В статье расскажу, какие подходы мы перепробовали и почему они не сработали, как выглядит путь пользователя и что у решения под капотом — от контрольных сумм до локального распознавания сканов.
С чего всё началось
Проблема типовая, и она есть в любой организации, где ИИ не заблокирован (а часто и там, где заблокирован — просто с личных телефонов). Достаточно представить обычный рабочий день:
HR вставляет резюме кандидата целиком — «сделай выжимку». В резюме телефон, почта, дата рождения, иногда паспорт.
Юрист загружает договор — «перепиши третий раздел попроще». В договоре реквизиты обеих сторон, счета, подписанты.
Бухгалтер кидает табличку — «посчитай среднее по отделам». В табличке фамилии и зарплаты.
Айтишник вставляет конфиг, который не заводится, — вместе с паролем от боевой базы, потому что пароль в этом конфиге и лежит.
Никто из них не вредитель. Каждый просто делает свою работу быстрее — и в этом вся коварность: граница «можно/нельзя» в момент вставки не видна. Человек вставил «текст договора», а не «персональные данные третьих лиц».
А дальше происходит то, о чём мало кто задумывается. Всё отправленное остаётся в истории чата на чужом сервере. Попадает в логи провайдера. Иногда — в обучающие выборки. И главное: кнопки «удалить моё сообщение с ваших бэкапов» не существует. Отправленное не возвращается.
Что мы перепробовали
Прежде чем писать своё, мы прошли классический путь. Он короткий, и каждый шаг чему‑то научил.
1. Менять данные руками. Просим людей заменять «Иванова» на «Клиента N» перед отправкой. Аккуратный человек делает так три дня, потом устаёт. А номер счёта в середине таблицы на четыреста строк руками не найдёт и не заменит вообще никто. Отпало.
2. Регулярка в скрипте. Написать поиск телефонов, ИНН и карт — кажется, дело на вечер. Мы честно попробовали, и выяснилось много весёлого:
\bв JavaScript не считает кириллицу буквами — «граница слова» в русском тексте просто не работает;любые десять цифр подряд радостно объявляются ИНН, и скрипт кричит на каждый номер накладной;
«Иванову Ивану Петровичу» и «Иванов Иван Петрович» — для регулярки два разных человека.
Пару недель такой жизни — и люди отключают защиту, потому что она мешает. Ложные срабатывания убивают доверие быстрее, чем пропуски.
3. Внешние анонимизаторы. Есть сервисы, которые принимают текст по API, находят чувствительное у себя на сервере и возвращают замаскированный вариант. Точность приличная. Но остановитесь на секунду: чтобы данные не утекли в ИИ, мы отправляем их... в другой внешний сервис. Ту же самую проблему мы не решили — мы её переименовали. Плюс задержка на каждый запрос, плюс ещё один договор на обработку персональных данных.
Из этих проб сложились три требования к решению:
Работает само. Не по кнопке — дисциплина не масштабируется.
Работает локально. Данные не покидают компьютер вообще: ни в ИИ, ни «к нам на сервер».
Не мешает. Человек продолжает пользоваться любимым чатом как раньше.
Из этих трёх пунктов расширение для браузера вывелось почти автоматически: оно живёт там же, где живёт проблема, — на вкладке с ИИ‑чатом.
Как это выглядит для человека
Путь пользователя состоит из четырёх шагов, и три из них происходят без его участия:
1. Отправка. Сотрудник пишет сообщение и жмёт «отправить». Расширение перехватывает отправку и за долю секунды проверяет текст.
2. Находки. Если нашлось чувствительное — появляется окно: вот что обнаружено (ФИО, карта, ИНН). Один клик — «Анонимизировать и отправить».
3. Маскирование. Каждое значение получает псевдоним, и на сервер ИИ уходит текст с метками:
// человек написал: "Составь ответ клиенту: Иванов Иван Петрович, карта 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 категории, свои правила, три режима работы. Версия с файлами, распознаванием сканов и раздачей настроек — по запросу.
И просьба: если найдёте текст, на котором детектор ошибается, — напишите в комментариях. У нас правило: каждый живой дефект заканчивается исправлением и регресс‑тестом. Такие сообщения двигают качество быстрее любых внутренних планов.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.