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

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

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

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

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

  • 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 категории, свои правила, три режима работы. Версия с файлами, распознаванием сканов и раздачей настроек — по запросу.

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

Комментарии (11)


  1. BugM
    17.08.2026 18:31

    Иишкам лучше явно говорить что там маскировано что-то конкретное. Так они лучше работают.

    Просто маскировать примерно так masked_email_hash1 masked_passport_number_hash2 и тому подобное. Сетки поймут.


    1. mishatimtim Автор
      17.08.2026 18:31

      Спасибо, сейчас впринципе и так хорошо работает, но доработка незначительная, в следующей версии добавим.


  1. ToxaBes
    17.08.2026 18:31

    Открыл расширение в браузере, внизу написано Offered by Lotus Security и email, который ведет на сайт. Все на русском, все хорошо написано, для безопасности, бла бла бла, есть бесплатная версия (как минимум, пока нужно обкатать само решение), есть кровавый энтерпрайз, все вроде бы ок, но... нет контактов.

    Странно, а чего стесняемся? Давайте разбираться. Простой поиск по имени компании и продукта и ой, компания в UK с каким-то турком в бенефициарах. Это ведь вы, да? Прям спать не можете в Великобритании/Турции и делаете бесплатное приложение с закрытым кодом, чтобы сохранить данные россиян.

    Какой отдел ИБ подобное пропустит вопрос конечно риторический.

    Если эта компания в UK к вам не относится, то прошу предоставить российские контакты/реквизиты.

    Если же это вы, то АХАХА, АХАХАХАХА.


    1. mishatimtim Автор
      17.08.2026 18:31

      Нафантазировали вы конечно сильно))

      Компания в Companies House к проекту отношения не имеет. Юрлица у проекта нет вообще. Домен я зарегистрировал ровно затем, чтобы разместить политику конфиденциальности — без неё расширение не принимают в Chrome Web Store. Это личный проект: решение я сделал и обкатал по работе, а бесплатную версию выложил, потому что задача общая, а вменяемых бесплатных инструментов под неё мало.

      Теперь по существу, потому что вопрос вы задаёте правильный. Я работаю в ИБ 10+ лет. У нас все расширения в браузерах запрещены по умолчанию, и каждое новое проходит аудит и прогон в песочнице прежде, чем попасть в разрешённый список. Своё расширение я пустил ровно через ту же процедуру и никаких поблажек ему не сделал.

      Поэтому предлагаю не верить мне на слово, а начать проверку с самого дешёвого шага. Расширение для Chrome не бывает закрытым технически: оно не компилируется, браузер кладёт его на диск обычными файлами и исполняет тот же JavaScript, который вы там видите. Открываете папку расширения и выполняете одну команду:

      grep -rn "fetch(\|XMLHttpRequest\|sendBeacon\|WebSocket\|EventSource" .

      Это исчерпывающий список способов отправить что-либо наружу. В бесплатной версии вывод пустой: ни одного сетевого вызова во всём коде, ни одного внешнего ресурса в интерфейсе — ни CDN, ни шрифтов, ни счётчиков.


      1. ToxaBes
        17.08.2026 18:31

        Юрлица у проекта нет вообще.

        @

        Я работаю в ИБ 10+ лет.

        И предлагаете нам при таком раскладе внедрять ваше расширение в контур ИБ? Вы либо трусы либо крестик снимите/наденьте.

        решение я сделал и обкатал по работе, а бесплатную версию выложил

        А платная энтерпрайз версия у вас на сайте. Т.е. вы предлагает платную версию, без юрилца, на сайте который ассоциируется с Lotus Security по доменному имени. Просто "обкатали по работе". Окей.

        Поэтому предлагаю не верить мне на слово

        За это не переживайте.

        В бесплатной версии вывод пустой: ни одного сетевого вызова во всём коде, ни одного внешнего ресурса в интерфейсе

        А вот тут верю, полностью. Верю, что СЕЙЧАС в БЕСПЛАТНОЙ версии все чисто. Останется ли так с последующем обновлением или в энтерпрайз версии одному турку известно.

        Не обижайтесь, но для ИБ специалиста вы один огромный red флаг. После 10+ лет работы вы должны это понимать.


        1. mishatimtim Автор
          17.08.2026 18:31

          Хамство и «одному турку известно» комментирую один раз: это не аргумент и не разговор по существу. Проверяемое вы признали сами. Непроверяемое обсуждать не буду.


          1. ToxaBes
            17.08.2026 18:31

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

            Я лишь наглядно показал, что в текущем виде вы и ваше приложение не проходите первичную проверку в ИБ никоим образом. И для меня немного странно то, что специалист с 10 летним стажем в ИБ этого не понимает.

            Была бы ваша бесплатная часть выложена на гитхабе или было бы юрлицо в РФ, то был бы совершенно другой разговор. А так, один сплошной редфлаг.


  1. drbond
    17.08.2026 18:31

    Слушайте, ну как можно доверять для zdr какому-то левому расширению в браузере даже без сертификации и аудита исходников? Какая нормальная СБ это пропустит? А если это расширение поставлено исключительно с целью сбора всех ПДн и отправки их на свой сервер? Бойтесь данайцев дары приносящих!


    1. nerv110
      17.08.2026 18:31

      приложению с 6ю бета-тестерами :)

      от ТС который зарегистрирован вчера


      1. mishatimtim Автор
        17.08.2026 18:31

        Всё так: бета, пользователей мало, аккаунт новый — я это и не скрываю. Код лежит у вас на диске.

        Если есть конкретные вопросы — задавайте, отвечу.


    1. mishatimtim Автор
      17.08.2026 18:31

      Полностью согласен, и спорить не буду: «не доверять» — правильная позиция по умолчанию, у нас в компании она такая же. Отвечу тем, что можно проверить.

      Про аудит исходников. Он здесь выполним, а не декларативен. Файлы лежат на диске в открытом виде:

      Windows: %LOCALAPPDATA%\Google\Chrome\User Data\Default\Extensions\gjkjeifejkokjkfmadkdpkhfjgiahgnj\

      На остальные вопросы ответил развернуто в комментарии выше.