Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

clickhouse-obfuscator

一个用于表数据混淆的简单工具。

它读取输入表并生成输出表,后者会保留输入中的某些属性,但数据内容不同。 它可用于发布与真实生产数据非常接近的数据,以便进行基准测试。

它旨在保留数据的以下属性:

  • 每一列以及每组列 Tuple 的值基数 (不同值的数量) ;

  • 条件基数:在另一列取某个值的条件下,一列中不同值的数量;

  • 整数绝对值的概率分布;有符号整数的符号;浮点数的指数和符号;

  • 字符串长度的概率分布;

  • 数值为零、空字符串、空数组和 NULL 的概率;

  • 使用 LZ77 和 entropy 家族编解码器压缩时的数据压缩率;

  • 时间值在整张表中的连续性 (差值的量级) ;浮点值的连续性;

  • DateTime 值中的日期 component;

  • 字符串值的 UTF-8 有效性;

  • 字符串值看起来自然。

上述大多数属性对于性能测试都很重要:

由于保留了基数、量级、压缩率等属性,读取数据、筛选、聚合和排序的速度 将与原始数据几乎相同。

它以确定性的方式工作:你定义一个 seed 值,转换结果由输入数据和 seed 决定。 某些转换是一一对应的,并且可以逆向还原,因此你需要使用足够大的 seed,并将其保密。

它会使用一些密码学基本类型来转换数据,但从密码学角度看,这种做法并不严谨,因此除非你有其他理由,否则不应将结果视为安全。结果中仍可能保留一些你不希望发布的数据。

它始终会让源数据中的 0、1、-1、日期、数组长度以及 null 标志保持完全不变。 例如,如果你的表中有一列 IsMobile,其值为 0 和 1,那么在转换后的数据中,这一列仍会保持相同的值。

因此,用户将能够精确计算移动流量的实际 ratio。

再举一个例子。如果你的表中包含一些私网数据,例如用户邮箱,而你不想公开任何一个具体的邮箱地址, 那么当你的表足够大、包含多个不同邮箱,并且不存在某个邮箱的出现频率远高于其他邮箱时,它会将所有数据匿名化。但如果某一列中的不同值数量较少,它也可能复现其中的一些值。 你应该了解这个工具的工作算法,并微调其命令行参数。

这个工具只有在数据量至少达到中等规模时 (至少数千行) 才能良好工作。

Navigation