メインコンテンツへスキップ
メインコンテンツへスキップ

clickhouse-obfuscator

テーブルデータを難読化するためのシンプルなツールです。

入力テーブルを読み込み、入力テーブルのいくつかの特性は保持しつつも異なるデータを含む出力テーブルを生成します。 これにより、ベンチマークで利用する目的で、ほぼ実運用データに近いデータを公開できるようになります。

このツールは、以下のデータ特性を保持するように設計されています。

  • 各カラムおよびカラムの組の「値のカーディナリティ(異なる値の個数)」;

  • 条件付きカーディナリティ:あるカラムの値に条件を付けたときの、別のカラムの異なる値の個数;

  • 整数の絶対値の確率分布、有符号整数の符号、浮動小数点数の指数と符号;

  • 文字列長の確率分布;

  • 数値のゼロ値、空文字列と空配列、NULL の出現確率;

  • LZ77 やエントロピー系コーデックで圧縮したときのデータ圧縮率;

  • テーブル全体にわたる時刻値の連続性(差分の大きさ)、浮動小数点値の連続性;

  • DateTime の日付成分;

  • 文字列値の UTF-8 妥当性;

  • 文字列値が自然な見た目であること。

上記の特性の大部分は、性能テストに有用です。

カーディナリティ、値の大きさ、圧縮率などが保持されているため、 データの読み取り、フィルタリング、集約、ソートは元のデータとほぼ同じ速度で動作します。

このツールは決定論的に動作します。シード値を指定すると、変換は入力データとシード値によって一意に決まります。 一対一で逆変換可能な変換もあるため、大きなシード値を使い、それを秘密にしておく必要があります。

データ変換にはいくつかの暗号プリミティブを使用していますが、暗号学的な観点から見ると正しいやり方ではありません。そのため、ほかに根拠がない限り、結果を安全なものとは見なさないでください。結果には、公開したくないデータが一部残る可能性があります。

このツールは、0、1、-1 の数値、日付、配列の長さ、null フラグを常に元データとまったく同じ状態で残します。 例えば、テーブルに 0 と 1 の値を持つ IsMobile カラムがある場合、変換後のデータでも同じ値のままになります。

したがって、ユーザーはモバイルトラフィックの正確な比率を算出できます。

もう一つ例を挙げます。テーブル内にユーザーのメールアドレスのような機微なデータがあり、単一のメールアドレスも公開したくないとします。 テーブルが十分大きく、異なるメールアドレスが多数含まれていて、特定のメールアドレスだけが他より極端に高頻度で出現していないのであれば、すべてのデータは匿名化された状態になります。しかし、あるカラムに含まれる異なる値の種類が少ない場合には、その一部が再現されてしまう可能性があります。 このツールの動作アルゴリズムを確認し、コマンドラインパラメータを適切にチューニングしてください。

このツールがうまく機能するのは、少なくとも中程度以上のデータ量(少なくとも数千行)がある場合のみです。