Parquet 암호화

Parquet 암호화

버전 0.10.0부터 DuckDB는 암호화된 Parquet 파일을 읽고 쓸 수 있어요. DuckDB는 Parquet Modular Encryption specification을 대체로 따르는데, 몇 가지 제한 사항이 있습니다.

출처: 공식문서

암호화된 파일 읽고 쓰기

PRAGMA add_parquet_key 함수를 사용하면 이름이 붙은 128·192·256비트 암호화 키를 세션에 추가할 수 있습니다. 이 키들은 메모리에 저장돼요.

PRAGMA add_parquet_key('key128', '0123456789112345');
PRAGMA add_parquet_key('key192', '012345678911234501234567');
PRAGMA add_parquet_key('key256', '01234567891123450123456789112345');
PRAGMA add_parquet_key('key256base64', 'MDEyMzQ1Njc4OTExMjM0NTAxMjM0NTY3ODkxMTIzNDU=');

암호화된 Parquet 파일 쓰기

키(예: key256)를 지정한 뒤 파일은 다음과 같이 암호화할 수 있습니다.

COPY tbl TO 'tbl.parquet' (ENCRYPTION_CONFIG {footer_key: 'key256'});

암호화된 Parquet 파일 읽기

특정 키(예: key256)로 암호화된 Parquet 파일은 다음과 같이 읽을 수 있어요.

COPY tbl FROM 'tbl.parquet' (ENCRYPTION_CONFIG {footer_key: 'key256'});

또는:

SELECT *
FROM read_parquet('tbl.parquet', encryption_config = {footer_key: 'key256'});

상호운용성 (Interoperability)

DuckDB는 Arrow C++ API(예: PyArrow)로 쓴 균일 암호화 Parquet 파일을 읽을 수 있어요. 단, footer와 모든 컬럼에 동일한 암호화 키가 사용되어야 합니다.

제한 사항 (Limitations)

DuckDB의 Parquet 암호화에는 현재 다음과 같은 제한이 있습니다.

DuckDB는 footer_key로 footer와 모든 컬럼을 암호화해요. Parquet 스펙은 컬럼마다 서로 다른 키로 개별 암호화하는 것도 허용합니다. 예:

COPY tbl TO 'tbl.parquet'
    (ENCRYPTION_CONFIG {
        footer_key: 'key256',
        column_keys: {key256: ['col0', 'col1']}
    });

하지만 이 기능은 지금 지원되지 않아서 (당분간) 오류가 발생합니다.

Not implemented Error: Parquet encryption_config column_keys not yet implemented

성능 영향

암호화에는 성능 영향이 있다는 점에 유의하세요. 암호화 없이 TPC-Hlineitem 테이블(SF1, 6M 행·15컬럼)을 Parquet 파일로 읽고 쓰는 데 각각 0.26초·0.99초가 걸립니다. 암호화하면 0.64초·2.21초로, 둘 다 암호화하지 않은 버전보다 약 2.5배 느려져요.

더 알아보기 (Learn more)

  • Parquet Modular Encryption 스펙 링크와 함께 특정 워크로드에서 암호화가 미치는 성능 비용을 미리 가늠해 보세요.
  • 컬럼별 키 암호화(column_keys)는 향후 지원 예정이므로, 현재는 footer+전체 컬럼 균일 키 방식만 사용해야 합니다.