Что такое обезличивание, маскирование и токенизация, есть ли разница в этих терминах?

Что такое обезличивание, маскирование и токенизация, есть ли разница в этих терминах?

Изображение: recraft

Обезличивание, маскирование и токенизация — это методы защиты персональных данных и конфиденциальной информации, направленные на предотвращение несанкционированного доступа к данным.

Обезличивание — это общее понятие, которое предполагает удаление или скрытие информации, позволяющей идентифицировать конкретного человека, организацию или другой субъект, включая все виды чувствительных данных. Маскирование является частным случаем обезличивания и используется для скрытия отдельных элементов данных, таких как, например, паспортные номера, номера счетов или контактные данные, оставляя структуру данных пригодной для обработки. Алгоритмы маскирования позволяют обезличивать различные данные с сохранением формата и бизнес‑логики: например, корректно генерировать даты (с возможностью ограничения по диапазонам дней, месяцев и т. д.), маскировать номера банковских карт с сохранением платежной системы, банка-эмитента, типа карты, с пересчетом контрольного разряда, а также поддерживают другие структурированные типы данных.

Еще один из важных методов обезличивания информации — токенизация, метод защиты данных, при котором чувствительная информация заменяется безопасным токеном, а связь между ним и оригиналом хранится отдельно или нигде не хранится и построена на криптографии. Основная цель токенизации — предотвратить прямой доступ к оригинальным данным, снижая риск утечки, при этом обеспечивая возможность обработки и аналитики, а также восстановления исходных данных. Рассмотрим варианты токенизации:

Классическая (произвольная) токенизация:

  • Токен создаётся случайным образом и не имеет математической связи с исходными данными;
  • Преимущество: высокий уровень безопасности, невозможно восстановить данные без токен-базы;
  • Недостаток: требуется централизованное хранилище токенов;
  • Пример: 1234 5678 9012 3452 (номер карты) -> A1B2-C3D4-E5F6-7890 (токен);

Криптографическая токенизация:

  • Токены формируются с помощью криптографических алгоритмов, включая FPE (Format-Preserving Encryptionшифрование с сохранением формата), AES CBC-CTS и других. При этом токены имеют математическую связь с исходными данными, поэтому не требуется хранить базу сопоставления токенов и исходных данных;
  • Преимущество: сохраняют структуру данных, например, длину и формат номера карты, что удобно для систем, где требуется совместимость форматов. Для дополнительной защиты в FPE применяются понижающие словари, которые скрывают структуру исходных данных, а также предотвращают атаки на частоты и форматы. При этом токенизация позволяет проводить пре/пост обработку для пересчета контрольных разрядов, замены идущих подряд согласных/гласных и т.д. Еще одним из преимуществ токенизации — возможность восстановить исходное значение;
  • Недостаток: имеется математическая связь с исходными данными;
  • Пример: 1234 5678 9012 3452 (номер карты) -> 1234 5643 5612 4389 (токен); Иван -> Лова (токен);

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

  • Посимвольная замена — метод маскирования, при котором каждый символ исходного значения преобразуется отдельно по заданному правилу, с возможностью сохранения определенных позиций или символов без изменений;

Применение: паспортные данные, номера документов и т.д.;

  • Замена по словарю — замена по заранее сформированным словарям;

Применение: ФИО, адреса, организации, банки и т.д.;

  • Перемешивание строк;

Применение: комментарии, зарплата, адреса и т. д.;

  • Маскирование телефона с возможностью сохранения кода города, замены по справочнику и т. д.;

Применение: телефоны;

  • Маскирование Email с возможностью разделения домена и имени для более точечной настройки маскирования;

Применение: электронная почта;

  • Полная очистка (через NULL), в том числе бинарных файлов;

Применение: комментарии, бинарные файлы и т. д.;

  • Замена на константу, в том числе бинарных файлов, уникальных значений и т.д.;

Применение: комментарии, бинарные файлы и т. д.;

  • Маскирование даты с возможностью сохранения года, месяца, а также маскирования дат, связанных между собой;

Применение: даты рождения, даты выдачи и окончания документов;

  • Маскирование с пересчетом контрольных разрядов;

Применение: ИНН, СНИЛС, ОГРН, ОМС, банковские карты и др.;

  • Токенизация — замена значений на токены, в том числе с возможностью восстановления исходных данных;

Применение: любые данные;

  • Минимальное-максимальное значение, для замен в диапазонах;

Применение: зарплаты;

  • Замена по регулярному выражению — замена по специальному правилу на языке Regex;

Применение: любые данные;

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

Применение: любые данные;

  • Маскирование адреса, в том числе по базе ФИАС, ГАР, КЛАДР, замена координат в заданных диапазонах и т. д.;

Применение: адреса, координаты;

  • Маскирование логов, в том числе с возможностью восстановления исходных данных;

Применение: журналы, файлы;

  • Маскирование на основе признаков (пола, организации и т. д.);

Применение: ФИО, организации, банки, адреса и т. д.;

  • Пользовательские алгоритмы — функционал, позволяющий создавать свои алгоритмы, например на языке Groovy, работать с составными колонками и т. д.;

Применение: любые сложные данные, где требуется дополнительная обработка текста и одновременная работа с несколькими колонками: хеширование, транслитерация, форматирование, объединение колонок и передача в другую и т. д.;

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

Какие типы маскирования бывают, что такое динамическое маскирование и как оно реализуется средствами СУБД?

Существует несколько подходов к маскированию данных. Их можно реализовать либо на уровне ETL-процессов (обычно через промежуточный сервер с отдельной копией базы), либо напрямую средствами SQL, когда обработка выполняется в самой СУБД и не требует дополнительных инфраструктурных ресурсов. Каждый метод решает свою задачу и подходит под разные сценарии безопасности:

  • Статическое маскирование (SDM, InPlace) — выполняется внутри одной базы данных с использованием стандартных SQL-операций, через SELECT и UPDATE. Оригинальные данные заменяются на замаскированные, после чего их невозможно восстановить без резервной копии.

Преимущества подхода «InPlace»:

  • Не требует сложной инфраструктуры;
  • Используется меньшее количество дискового пространства;
  • В некоторых случаях общий процесс обезличивания проходит быстрее чем в режиме «On-The-Fly» (*зависит от архитектуры БД);

Минусы подхода «InPlace»:

  • Требуется разграничение прав доступа и дополнительный контроль, так как в определенной момент времени данные находятся в не обезличенном виде.
  • Ошибки в маскировании удлиняют процесс, требуется восстановление данных из резервных копий;
  • Маскирование «на лету» (OnTheFly) — использует две базы данных: одну продуктивную (точнее ее копию) и одну «маскированную» копию (сначала формируется структура исходной БД, то есть ее слепок, далее в нее передаются уже замаскированные данные). Передача происходит с помощью операций SELECT и INSERT в целевую базу, при этом значения заменяются на лету. Такой метод чаще всего применяется для передачи данных из закрытого контура в открытый.

Преимущества подхода «OnTheFly»:

  • Позволяет проводить неограниченное количество (только в рамках ресурсов самой СУБД) повторных процессов маскирования, без необходимости восстановления из продуктивной базы (копии).
  • Не требует дополнительного контроля доступа до и в момент маскирования, так как данные в исходную систему поставляются уже в замаскированном виде;
  • Использование операций типа INSERT менее ресурсоёмко и работает быстрее, однако многое зависит от структуры БД.

Минусы подхода «OnTheFly»:

  • Требует отдельной базы и хранилища;
  • Нужен механизм синхронизации данных между источником и маскированной копией. Он должен контролировать структуру источника и приемника;
  • Динамическое маскирование (DDM) — технология, при которой маскирование применяется в момент выполнения запроса. Исходные данные при этом не изменяются. Пользователи с разными правами доступа видят разные представления одной и той же информации: одни — исходные значения, другие — частично скрытые или полностью замаскированные;

Реализация статического маскирования:

С помощью СУБД и скриптов: такие СУБД, как Oracle и Postgres, имеют дополнительный функционал статического маскирования, правда со своими ограничениями:

  • Нет готовых алгоритмов, заточенных под российский рынок;
  • Если в компании присутствуют различные типы СУБД, это делает задачу консистентности данных и поддержку такой системы практически невозможной или очень сложной;
  • Зачастую требуют дополнительных дорогостоящих лицензий, например, как для СУБД Oracle;
  • Требуют также держать отдельные команды разработки для разных типов СУБД;
  • Требуют больших вычислительных ресурсов, так как алгоритмы маскирования и регулярные выражения для поиска часто выполняются непосредственно на самих СУБД;

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

Реализация динамического маскирования:

  • С помощью СУБД: многие современные СУБД (Microsoft SQL Server, Oracle, PostgreSQL) позволяют применять DDM средствами встроенных функций. Маскирование происходит на уровне SQL-запросов, используя правила для разных ролей пользователей;
  • Через прокси и/или API: DDM можно реализовать между приложением и базой данных. Прокси перехватывает запросы и возвращает маскированные данные согласно политикам безопасности;

Преимущества подхода DDM:

  • Отсутствие изменения оригинальной базы — исходные данные остаются целыми и не требуют восстановления из-за некорректных алгоритмов маскирования или ошибок в ходе обезличивания;
  • Гибкая настройка прав доступа — разные пользователи видят только допустимую информацию;
  • Ускорение внедрения — можно защитить данные без создания копий или сложной ETL-процедуры;

Теперь рассмотрим, какие встроенные механизмы маскирования данных предлагают популярные СУБД, какие ограничения и недостатки есть у этих подходов, а также разберём, как реализовано динамическое маскирование в Microsoft SQL Server, Oracle и PostgreSQL.

1. Microsoft SQL Server

SQL Server предоставляет встроенные возможности динамического маскирования данных (Dynamic Data Masking, DDM) для ограничения раскрытия конфиденциальной информации пользователям без соответствующих привилегий.

1.1 Динамическое маскирование данных (DDM, встроенное)

  • Назначение: маскирует данные в Runtime без изменения самих данных, применяется к результатам запросов для непривилегированных пользователей;
  • Версии: SQL Server 2016 (13.x+) и выше, Azure SQL;
  • Стоимость: встроено, отдельная лицензия не требуется;

Алгоритмы маскирования:

  1. Default Masking: полная маскировка по типу данных;

Строки -> XXXX

Числа -> 0

Дата -> 1900-01-01

  • Email Masking: раскрывает первую букву и домен;

Пример: aXXX@XXXX.com

  • Random Masking: случайное числовое значение в указанном диапазоне;

Пример: 1–100

  • Partial / Custom String Masking: раскрывает часть строки и маскирует остальное;

Пример: Roberto -> Rxxxxxo

  • Datetime Masking (SQL Server 2022+): маскирует выбранные компоненты даты/времени;

Пример: только год, месяц или день

Ограничения и слабые места:

Нельзя маскировать:

  • Вычисляемые столбцы;
  • FILESTREAM;
  • COLUMN_SET;
  • Always Encrypted столбцы;
  • Полнотекстовые индексы (FULLTEXT);
  • Столбцы во внешних таблицах PolyBase;

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

  • Делать агрегаты: MIN(), MAX(), COUNT(), AVG();
  • Использовать предикаты: WHERE, LIKE, IN, JOIN;
  • Перечислять уникальные значения;

Это позволяет вычислять исходные данные через статистический анализ. Ниже я покажу пример SQL-скрипта, который позволяет перебирать замаскированные данные в СУБД MSSQL (через DDM).

Сначала добавим для колонки тестовую функцию маскирования, как показано ниже (важно отметить, что в отличие от Oracle и PostgreSQL, информация о замаскированных полях хранится в метаданных, доступ к которым по умолчанию есть у любого пользователя):

Рисунок 1 Пример настройки динамического маскирования в MSSQL

Пример того, как пользователи видят замаскированные данные:

Рисунок 2 Результат динамического маскирования в MSSQ

Пример того, как выглядят реальные данные:

Рисунок 3 Исходные данные в MSSQ

Теперь для демонстрации напишем небольшой скрипт, который будет перебирать значения замаскированных данных, пока не вернется пустой результат и мы не дойдем до конца словаря (с учетом даже если между словами есть пробел или даже несколько). Пример скрипта представлен ниже:

Рисунок 4 Скрипт для перебора исходных значений

В результате работы скрипта получилось менее чем за 1 секунду подобрать замаскированное ФИО, как показано ниже (то же самое можно сделать для других колонок или целиком для всей таблицы):

Рисунок 5 Результат скрипта

2. Oracle

Oracle предоставляет полный набор средств для защиты и маскирования данных, как статического, так и динамического. Однако, стоит отметить, что помимо лицензии Enterprise, требуется дополнительная лицензия на маскирование (add-on) и/или Advanced Security Option.

1.1 Data Masking and Subsetting Pack (SDM, платное)

  • Назначение: статическое маскирование данных и создание усеченных данных (subsets) для передачи в DEV/TEST, снижает риск утечек;
  • Версии: Oracle 12c Release 1 (12.1+) и выше, через Oracle Enterprise Manager (редакция Enterprise);
  • Стоимость: отдельный платный пакет OEM (не входит в Advanced Security Option), лицензируются только источники;

Алгоритмы маскирования:

  1. Substitution Masking: подмена значений по словарям (имена, города, email);
  2. Shuffle Masking: случайная перестановка данных в колонке (разрывает связи между ФИО и зарплатой);
  3. Blurring / Perturbation: «зашумляет» значения (± диапазон);
  4. Format Preserving Randomization: сохраняет длину и формат (Aa-9999 -> Bb-4217);
  5. Encryption (Reversible): форматосохраняющее шифрование (для последующего восстановления);
  6. Deterministic Masking: одинаковый вход -> одинаковый выход во всех базах;
  7. Conditional Masking: разные маски в зависимости от значения (US SSN -> XXX-XX-1234, UK NIN -> AB****CD);
  8. Compound Masking: согласованное маскирование связанных колонок (город + штат + ZIP);
  9. User-defined PL/SQL functions: любые пользовательские сценарии маскирования;

Возможности Subsetting:

Создание усеченных копий БД — например, выборка только за определённый период или по конкретному региону. Это сокращает размер тестовых баз и ускоряет Dev/Test процессы.

  • Удаление ненужных строк перед передачей в DEV/TEST;
  • Goal-based: например, 1% выборки из таблицы в 10 млрд строк;
  • Condition-based: оставлять только клиентов после 2024 года / только один регион;
  • Сохранение PK/FK целостности при вырезании данных;

Ограничения:

Нельзя маскировать:

  • В связке с DISTINCT и ORDER BY
  • В связке с GROUP BY
  • Вычисляемые колонки

1.2 Data Redaction (DDM, платное)

  • Назначение: маскирует данные в Runtime без изменения самих данных;
  • Версии: Oracle 12c Release 1 (12.1+) и выше (редакция Enterprise);
  • Стоимость: часть Advanced Security Option (платная, кроме Autonomous AI DB — для нее бесплатно);

Алгоритмы маскирования:

  1. Full Redaction: полная маскировка (числа -> 0, строки -> пробел);
  2. Partial Redaction: частичная маскировка (например, телефон +79161234567 -> +7916***4567);
  3. Regular Expression Redaction: маскирование по шаблону (email, паспорт, банковская карта, SSN и др.);
  4. Random Redaction: случайные значения при каждом запросе;
  5. Nullify Redaction: замена на NULL;

Совместимость:

  • Oracle Database Vault: политики Redaction учитывают realm’ы; Пользователь без прав не видит данные и получает ошибки при DML/DDL;
  • Real Application Security (RAS): защита колонок через права приложения (application privileges);
  • Data Masking and Subsetting Pack: Redaction можно применять на non-production базах поверх уже замаскированных данных;

Результат работы динамического маскирования:

Пример того, как выглядят реальные данные:

Рисунок 6 Исходные данные в Oracle

Пример как пользователи видят замаскированные данные:

Рисунок 7 Результат динамического маскирования в Oracle

Примеры SQL запросов для настройки DDM:

Ниже представлены скрипты для включения динамического маскирования:

  • PARTIAL
Рисунок 8 Алгоритм PARTIAL, динамическое маскирование в Oracle

  • REGEXP
Рисунок 9 Алгоритм REGEXP, динамическое маскирование в Oracle

  • RANDOM и FULL
Рисунок 10 Алгоритмы RANDOM и FULL, динамическое маскирование в Oracle

Минусы подхода:

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

  • Делать агрегаты: MIN(), MAX(), COUNT(), AVG();
  • Использовать предикаты: WHERE, LIKE, IN, JOIN;
  • Перечислять уникальные значения;

Это позволяет вычислять исходные данные через статистический анализ, так же, как и в MSSQL. Пример такого запроса ниже:

Рисунок 11 Пример перебора исходных данных в Oracle

3. PostgreSQL

PostgreSQL не имеет встроенного DDM/SDM в ядре, однако существует официальный плагин PostgreSQL Anonymizer («Anonymization & Data Masking for Postgres»), предоставляющий полноценное динамическое и статическое маскирование. Это расширение работает через декларативные политики, встроенные прямо в DDL.

Назначение: маскирование персональных или конфиденциальных данных с возможностью:

  • Dynamic — скрывать данные в Runtime для непривилегированных пользователей, оригинальные данные остаются на диске.
  • Static — физически изменять данные в таблицах (например, для передачи в DEV/TEST или архивирования).

Версии: PostgreSQL 11+

Стоимость: бесплатно, open source (pg_anonymizer)

Особенность: правила маскирования описываются в DDL таблицы и могут быть применены либо динамически при запросах, либо один раз для замены данных в таблице.

Методы применения маскирования:

  1. Anonymous Dumps
  2. Экспорт уже замаскированных данных в SQL-файл;
  3. Аналог статического экспорта «анонимной копии»;
  4. Static Masking
  5. Одноразовое применение правил к таблице (anon.anonymize_table()), реальные данные заменяются;
  6. Dynamic Masking
  7. Скрывает данные при запросах пользователей без привилегий;
  8. Оригинальные данные на диске остаются неизменными;
  9. Masking Views
  10. Создаёт виртуальные представления с масками для нужных ролей;
  11. Masking Data Wrappers
  12. Маскирует данные, полученное из внешних источников (через FDW);

Результат работы динамического маскирования:

В Oracle и MSSQL динамическое маскирование работает “на лету”, применяясь при выполнении SQL-запроса, но при этом фильтры WHERE и условия запроса все равно оперируют реальными значениями столбцов, поэтому исходные данные могут быть восстановлены. В PostgreSQL Anonymizer маскирование устроено иначе: движок SQL видит только уже подставленные маски, а не реальные значения, поэтому перебор условий или фильтров по исходным данным невозможен.

Пример того, как выглядят замаскированные данные (поле lastname при повторном запросе формируется заново):

Рисунок 12 Пример замаскированных данных в PostgreSQL

Если мы попробуем перебирать значения по маске, то мы будем работать не исходными значениями, а уже замаскированными, что не позволяет узнать исходные значения, как в Oracle и или MSSQL:

Рисунок 13 Демонстрация, что перебор исходных данных в Postgres не работает

В заключение хочется отметить, что специализированные решения по обезличиванию данных значительно надежнее и практичнее, чем встроенные механизмы СУБД или самописные скрипты, поскольку они создаются под реальные процессы, требования регуляторов и особенности российского рынка. В отличие от встроенных и кастомных средств, такие платформы обеспечивают единообразие маскирования для разных типов СУБД, не требуют отдельных команд разработки и не зависят от дорогих лицензий производителей. Кроме того, такие решения не нагружают СУБД тяжёлыми операциями, обеспечивая стабильность, предсказуемость и значительно снижают риски утечек информации.

Как сейчас выбрать систему по обезличиванию данных, которая будет выполнять все нормативные требования и на что стоит обратить внимание?

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

На что стоит обратить внимание при выборе решения по обезличиванию данных:

Профилирование:

  • Гибкость настройки, предустановленные алгоритмы поиска и валидации — в том числе поиск по бинарным файлам, а также использование Machine Learning;
Рисунок 14 Настройка правил профилирования

  • Системы тестирования — для тестирования правил поиска без необходимости запуска на самом источнике;
Рисунок 15 Система проверки алгоритмов профилирования
  • Инвентарь для отображения структуры БД, ограничений и связей, с возможностью версионирования (для отслеживания изменений в БД и пользовательских настроек), настройкой алгоритмов, фильтрацией, выгрузкой в Excel, получения примеров (обезличенных, в том числе после применения алгоритмов маскирования, без необходимости подключения к БД);
Рисунок 16 Инвентарь маскирования и профилирования
Рисунок 17 Примеры данных после профилирования, демонстрация маскирования

  • Настройка наборов правил для гибкой фильтрации профилирования/маскирования и контроля пользовательских изменений, структуры БД и объемов исходных данных;
Рисунок 18 Пример редактирования набора правил
Рисунок 19 Пример набора правил

Маскирование:

Предустановленные алгоритмы маскирования, их перечень описал в начале статьи. В том числе с возможностью написания сложных пользовательских алгоритмов (например, для пересчета SHA256 после маскирования), а также работы с нескольким колонками одновременно (без необходимости создания отдельных процессов для последовательных операций);

Рисунок 20 Пример написания пользовательских скриптов
Рисунок 21 Результат тестирования пользовательских скриптов

  • Функционал SQL пред/пост обработки — для отключения/включения обвязки БД, а также выполнения пользовательских SQL скриптов, который генерирует SQL скрипты на основе структуры БД и выбранных алгоритмов маскирования, при этом давая возможность пользователю их редактировать, при необходимости;
  • Функционал маскирования логов с возможностью восстановления исходных данных;
Рисунок 22 Пример детектирования токенов для маскирования лога

Журналирование — детальная фиксация всех авторизаций пользователей, запусков заданий маскирования и изменений конфигураций для обеспечения аудита и отслеживания процессов и изменений;

Рисунок 23 Журналирование

Эффективная система обезличивания данных должна быть комплексным решением, обеспечивающим баланс между технологической гибкостью и соответствием нормативным требованиям. При выборе продукта необходимо оценивать следующие ключевые аспекты:

1. Базовый функционал

  • Автоматизированное профилирование данных с построением связей и структуры БД;
  • Расширенный арсенал алгоритмов маскирования (токенизация, маскирование по словарю, посимвольная замена, маскирование дат, работа с бинарными данными);
  • Поддержка режимов INSERT и UPDATE для СУБД;
  • Детерминированность;
  • Консистентность;
  • Без внутреннего хранения замаскированных копий БД;

2. Нормативное соответствие

  • Полное покрытие требований 152-ФЗ, Приказа №140 и Постановления №1154;
  • Верификация результатов обезличивания;
  • Детальный аудит и логирование всех операций;

3. Интеллектуальные возможности

  • ML-алгоритмы для автоматического обнаружения конфиденциальных данных;
  • Маскирование журналов транзакций и системных логов;
  • Пользовательские сценарии обезличивания;
  • Поиск конфиденциальной информации в бинарных данных;

4. Архитектурная гибкость

  • Модульная архитектура с возможностью горизонтального масштабирования;
  • API для интеграции с существующей ИТ-инфраструктурой;
  • Конструктор пользовательских алгоритмов и генератор SQL скриптов обработки;

Система обезличивания данных — это не просто набор алгоритмов, а полноценная платформа, способная обеспечить безопасность, соответствие законодательству и высокую производительность. Специализированные решения выгодно отличаются от встроенных средств СУБД и самописных скриптов наличием готовых алгоритмов, адаптированных под российские требования, а также использованием «Machine learning» для поиска конфиденциальных данных. Они обеспечивают масштабируемость, детальный аудит и гибкую интеграцию в ИТ-ландшафт. В итоге такие системы позволяют организациям снижать риски, ускорять внедрение и гарантировать надежный уровень защиты.

Автор: Владышевский Иван Максимович, ведущий специалист по ИБ компании Secret Technologies.

Secret Technologies
Автор: Secret Technologies
Команда Secret Technologies была собрана более восьми лет назад и ведет разработки своих продуктов, начиная с 2012 года. Специалисты компании успешно реализовали десятки проектов в области информационных технологий и информационной безопасности в различных отраслях.
Комментарии: