> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ClickHouse Obfuscator 문서

# clickhouse-obfuscator

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

입력 table을 읽어 입력 데이터의 일부 속성은 유지하면서도 내용은 다른 출력 table을 생성합니다.
벤치마크에 사용할 수 있도록 실제 운영(production) 데이터와 거의 유사한 데이터를 공개할 수 있게 해줍니다.

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

* 모든 컬럼과 모든 컬럼 튜플에 대한 값의 카디널리티(cardinality, 고유값 수)

* 조건부 카디널리티: 다른 컬럼 값의 조건에 따른 특정 컬럼의 고유값 수

* 정수 절댓값의 확률 분포, signed integer의 부호, float의 지수부와 부호

* 문자열 길이의 확률 분포

* 숫자 0, 빈 문자열과 배열, `NULL`의 출현 확률

* LZ77 및 entropy 계열 코덱으로 압축했을 때의 데이터 압축률

* table 전반에서 시간값의 연속성(값 차이의 크기), floating-point 값의 연속성

* `DateTime` 값의 날짜 component

* 문자열 값의 UTF-8 유효성

* 문자열 값이 자연스럽게 보이도록 함

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

카디널리티, 값의 규모, 압축률 등이 유지되므로
데이터 읽기, 필터링, 집계, 정렬이 원본 데이터와 거의 같은 속도로 동작합니다.

이 도구는 deterministic한 방식으로 동작합니다. seed 값을 정의하면 변환 결과는 입력 데이터와 seed에 의해 결정됩니다.
일부 변환은 일대일 대응이어서 역변환이 가능할 수 있으므로, 충분히 큰 seed를 사용하고 이를 시크릿으로 유지해야 합니다.

데이터를 변환하기 위해 일부 암호학적 기본 요소를 사용하지만, 암호학적 관점에서 올바르게 구현된 것은 아닙니다. 따라서 별도의 근거가 없다면 결과를 안전하다고 간주해서는 안 됩니다. 공개하고 싶지 않은 일부 데이터가 결과에 남아 있을 수 있습니다.

0, 1, -1, 날짜, 배열 길이, null 플래그는 항상 원본 데이터와 정확히 동일하게 유지됩니다.
예를 들어 table에 값이 0과 1인 `IsMobile` 컬럼이 있으면, 변환된 데이터에서도 동일한 값을 가집니다.

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

다른 예를 들어보겠습니다. table에 사용자 이메일과 같은 비공개 데이터가 있고, 어떤 이메일 주소도 공개하고 싶지 않다고 가정하겠습니다.
table이 충분히 크고 서로 다른 이메일이 여러 개 있으며 특정 이메일의 빈도가 다른 값보다 훨씬 높지 않다면 모든 데이터가 익명화됩니다. 하지만 컬럼에 서로 다른 값의 수가 적으면 그중 일부가 그대로 재현될 수 있습니다.
이 도구의 동작 알고리즘을 살펴보고 명령줄 매개변수를 세밀하게 조정해야 합니다.

이 도구는 최소한 어느 정도 규모의 데이터(적어도 수천 개의 행)가 있을 때만 제대로 동작합니다.
