본문으로 바로가기
본문으로 바로가기

clickhouse-obfuscator

테이블 데이터 난독화를 위한 단순한 도구입니다.

입력 테이블을 읽어서 출력 테이블을 생성하며, 입력 데이터의 일부 특성은 유지하지만 데이터 자체는 달라집니다. 이를 통해 벤치마크에서 사용하기 위해 실제 운영 데이터에 거의 가까운 데이터를 공개할 수 있습니다.

이 도구는 다음과 같은 데이터 특성을 유지하도록 설계되었습니다:

  • 각 컬럼과 컬럼 튜플별로 값의 카디널리티(서로 다른 값의 개수);

  • 조건부 카디널리티: 한 컬럼의 값에 대한 조건이 주어졌을 때 다른 컬럼의 서로 다른 값의 개수;

  • 정수의 절대값에 대한 분포, 부호가 있는 정수의 부호, 부동소수점 수의 지수와 부호;

  • 문자열 길이에 대한 분포;

  • 숫자의 0 값, 빈 문자열과 배열, NULL의 발생 확률;

  • LZ77 및 엔트로피 계열 코덱으로 압축했을 때의 데이터 압축 비율;

  • 테이블 전체에 걸친 시간 값의 연속성(차이의 크기), 부동소수점 값의 연속성;

  • DateTime 값의 날짜 구성 요소;

  • 문자열 값의 UTF-8 유효성;

  • 문자열 값이 자연스럽게 보이는지 여부.

위의 대부분 특성은 성능 테스트에 유용합니다.

카디널리티, 값의 크기, 압축 비율 등이 보존되기 때문에, 데이터 읽기, 필터링, 집계, 정렬은 원본 데이터에서와 거의 동일한 속도로 동작합니다.

이 도구는 결정적 방식으로 동작합니다. 시드(seed) 값을 정의하면, 변환은 입력 데이터와 시드에 의해 완전히 결정됩니다. 일대일로 대응하는 일부 변환은 되돌릴 수 있으므로, 충분히 큰 시드를 사용하고 이를 비밀로 유지해야 합니다.

데이터를 변환하기 위해 일부 암호화 프리미티브를 사용하지만, 암호학적 관점에서 올바르게 수행되는 것은 아니므로, 다른 근거가 없는 한 결과를 안전한 것으로 간주해서는 안 됩니다. 결과에는 공개를 원하지 않는 일부 데이터가 남을 수 있습니다.

항상 0, 1, -1 숫자, 날짜, 배열 길이, null 플래그는 원본 데이터와 정확히 동일하게 유지합니다. 예를 들어, 테이블에 값이 0과 1인 IsMobile 컬럼이 있는 경우, 변환된 데이터에서도 동일한 값을 갖게 됩니다.

따라서 모바일 트래픽의 정확한 비율을 계산할 수 있습니다.

또 다른 예를 들어 보겠습니다. 테이블에 사용자 이메일과 같은 개인 정보가 있고, 어떤 이메일 주소도 공개하고 싶지 않은 경우를 생각해 보십시오. 테이블이 충분히 크고 서로 다른 이메일이 다수 존재하며, 특정 이메일이 다른 모든 이메일보다 현저히 높은 빈도를 가지지 않는다면 모든 데이터가 익명화됩니다. 그러나 컬럼에 서로 다른 값의 수가 적으면 그중 일부가 그대로 재현될 수 있습니다. 이 도구의 작동 알고리즘을 살펴보고, 커맨드 라인 파라미터를 미세 조정해야 합니다.

이 도구는 적어도 어느 정도 이상의 데이터 양(최소 수천 개의 행)이 있을 때에만 잘 동작합니다.