clickhouse-obfuscator
用于对表中数据进行混淆的简单工具。
它读取一个输入表并生成一个输出表,输出表保留输入表的部分属性,但其中的数据已被替换。 这使你可以在发布用于基准测试的数据时,使用几乎等同于真实生产环境的数据。
该工具旨在保留以下数据属性:
-
每一列以及任意列组合的值基数(不同值的数量);
-
条件基数:在某一列的值满足特定条件时,另一列的不同值数量;
-
整数绝对值的概率分布;有符号整数的符号;浮点数的指数和符号;
-
字符串长度的概率分布;
-
数值为零的概率;空字符串和空数组,
NULL; -
使用 LZ77 和熵编码族进行压缩时的数据压缩比;
-
整个表中时间值的连续性(差值的量级);浮点数值的连续性;
-
DateTime值中的日期部分; -
字符串值的 UTF-8 合法性;
-
字符串值看起来足够自然。
上述大多数属性都适用于性能测试:
在保留基数、量级、压缩比等特性的前提下, 读取、过滤、聚合和排序等操作的执行速度将与原始数据几乎相同。
该工具以确定性的方式工作:你定义一个种子值,转换过程完全由输入数据和该种子共同决定。 某些转换是一一映射且可逆的,因此你需要使用足够大的种子并妥善保密。
它使用了一些密码学原语来转换数据,但从密码学的严格意义上讲实现并不完备,因此除非有额外的安全保证,否则不应将结果视为安全。结果中可能仍会保留一些你不希望公开的数据。
它始终保持数值 0、1、-1,日期、数组长度以及空标记与源数据完全一致。
例如,你的表中有一列 IsMobile,其取值为 0 和 1。在转换后的数据中,该列仍将保持相同的取值。
因此,用户仍然可以精确计算移动端流量占比。
再举一个例子:当你的表中包含一些私有数据,例如用户邮箱,而你不希望公开任何一个真实的邮箱地址时, 如果你的表足够大,包含多种不同的邮箱,而且不存在某个邮箱出现频率远高于其他邮箱的情况,那么所有数据都将被匿名化。但如果某一列中不同取值的数量较少,它可能会重现其中部分原始取值。 你应当了解该工具的工作原理和算法,并根据需要微调其命令行参数。
此工具仅在数据量至少达到中等规模(至少数千行)时才能较好地工作。