clickhouse-obfuscator
一个用于表数据混淆的简单工具。
它读取输入表并生成输出表,输出表保留输入的一些属性,但包含不同的数据。它允许发布几乎真实的生产数据,用于基准测试。
它旨在保留数据的以下属性
-
每个列和每列元组的值的基数(不同值的数量);
-
条件基数:在一个列的值的条件下,另一列的不同值的数量;
-
整数绝对值的概率分布;有符号整数的符号;浮点数的指数和符号;
-
字符串长度的概率分布;
-
数字零值的概率;空字符串和数组,NULL 值;
-
使用 LZ77 和熵系列编解码器压缩时的数据压缩率;
-
表中时间值的连续性(差异幅度);浮点值的连续性;
-
DateTime 值的日期部分;
-
字符串值的 UTF-8 有效性;
-
字符串值看起来自然。
以上大多数属性适用于性能测试
由于保留了基数、幅度、压缩率等,读取数据、过滤、聚合和排序的速度几乎与原始数据相同。
它以确定性的方式工作:您定义一个种子值,转换由输入数据和种子决定。一些转换是一对一的,可以逆转,因此您需要有一个大的种子并保密。
它使用一些加密原语来转换数据,但从密码学的角度来看,它并没有正确地做到这一点,这就是为什么除非您有其他理由,否则不应将结果视为安全的原因。结果可能会保留一些您不想发布的数据。
它始终将 0、1、-1 数字、日期、数组长度和 null 标志保持与源数据完全一致。例如,您的表中有一个名为 IsMobile 的列,其值为 0 和 1。在转换后的数据中,它将具有相同的值。
因此,用户将能够计算移动流量的准确比例。
让我们再举一个例子。当您的表中有一些私有数据(例如用户电子邮件)并且您不想发布任何单个电子邮件地址时。如果您的表足够大并且包含多个不同的电子邮件,并且没有电子邮件的频率比其他电子邮件高得多,那么它将匿名化所有数据。但是,如果一列中只有少量不同的值,则它可以重现其中一些值。您应该查看此工具的工作算法,并微调其命令行参数。
此工具仅在至少有适量数据(至少数千行)的情况下才能正常工作。