clickhouse-obfuscator
Простой инструмент для обфускации табличных данных.
Он читает входную таблицу и создает выходную таблицу, которая сохраняет некоторые свойства исходных данных, но содержит другие значения. Это позволяет публиковать данные, почти идентичные боевым, для использования в бенчмарках.
Он спроектирован так, чтобы сохранять следующие свойства данных:
-
кардинальности значений (количество различных значений) для каждого столбца и каждой комбинации столбцов (кортежей столбцов);
-
условные кардинальности: количество различных значений одного столбца при условии на значение другого столбца;
-
распределения вероятностей абсолютного значения целых чисел; знак знаковых целых; порядок (экспоненту) и знак для чисел с плавающей запятой;
-
распределения вероятностей длины строк;
-
вероятность нулевых значений чисел; пустых строк и массивов,
NULL; -
коэффициент сжатия данных при сжатии кодеками семейства LZ77 и энтропийными кодеками;
-
непрерывность (величину изменения) значений времени по всей таблице; непрерывность значений с плавающей запятой;
-
компоненту даты в значениях
DateTime; -
корректность строковых значений в кодировке UTF-8;
-
строковые значения выглядят естественно.
Большинство свойств, перечисленных выше, подходят для тестирования производительности:
чтение данных, фильтрация, агрегация и сортировка будут работать практически с той же скоростью, что и на исходных данных, благодаря сохранению кардинальностей, порядков величин, коэффициентов сжатия и т. п.
Работает детерминированно: вы задаете начальное значение (seed), и преобразование определяется входными данными и этим seed. Некоторые преобразования взаимно однозначны и могут быть обращены, поэтому вам нужно использовать большой seed и держать его в секрете.
Он использует некоторые криптографические примитивы для преобразования данных, но с криптографической точки зрения делает это некорректно, поэтому не следует считать результат надежно защищенным, если только у вас нет других оснований. Результат может сохранять некоторые данные, которые вы не хотите публиковать.
Он всегда оставляет числа 0, 1, -1, даты, длины массивов и флаги null в точности такими же, как в исходных данных.
Например, у вас есть столбец IsMobile в таблице со значениями 0 и 1. В преобразованных данных он будет иметь те же значения.
Таким образом, пользователь сможет посчитать точное соотношение мобильного трафика.
Еще один пример. Если в вашей таблице есть приватные данные, такие как email пользователя, и вы не хотите публиковать ни один реальный адрес электронной почты. Если таблица достаточно большая и содержит много различных email-адресов, и ни один из них не встречается значительно чаще других, все данные будут анонимизированы. Но если в столбце содержится небольшое количество различных значений, некоторые из них могут быть воспроизведены. Вам следует ознакомиться с алгоритмом работы этого инструмента и тонко настроить его параметры командной строки.
Этот инструмент корректно работает только при хотя бы умеренном объеме данных (не менее тысяч строк).