SOFTWARE
변경 이력
배포 버전별로 사용 방법과 결과에 영향을 주는 변경을 정리합니다. 내부 시험·빌드 도구와 문서 정정은 싣지 않습니다.
보안 공지 — 0.3.1 DB 연동 설치 권한 수정 2026-09-27
0.3.0 이하의 DB 연동 묶음으로 Oracle 또는 PostgreSQL에 SQL 함수를 설치한 경우, DB에 접속할 수 있는 모든 계정이 복호화 함수를 실행할 수 있습니다. 키가 SQL 밖에 있어도 복호화 권한이 곧 평문 열람 권한입니다. 설치 안내의 검색 예시는 주민번호·카드번호에 키 없는 SHA-256 해시를 써, 후보 값을 대입하면 원래 값을 알아낼 수 있었습니다.
조치
- 0.3.1 묶음의
revoke_public.sql을 실행해PUBLIC권한을 회수하고, 필요한 역할에만 권한을 줍니다. Oracle은revoke_public.sql실행 또는install.sql재실행, PostgreSQL은ALTER EXTENSION pg_strcrypt UPDATE또는sql/revoke_public.sql실행입니다. - 키 없는 해시로 만든 검색 열이 있으면 검색 인덱스 함수
strcrypt_search_index로 다시 계산하고 해시 열을 지웁니다. 해시 열이 있던 기간의 백업·복제본에도 같은 값이 남아 있습니다. - MySQL·MariaDB는 DB 권한으로 UDF 실행을 막을 수 없습니다. 암호문 테이블 조회 권한과 DB 계정 발급 범위로 복호화 권한을 좁힙니다.
문의는 문의 양식에서 문의 유형 "보안 취약점"으로 보내 주세요.
0.3.1 2026-09-27
0.3.0에서 만든 암호문·암호화 파일·감싼 데이터 키는 그대로 복호화됩니다. 기존 함수의 이름·인자와 SQL 함수는 바뀌지 않았고 검색 인덱스 함수가 더해졌습니다. Oracle·PostgreSQL 설치 스크립트가 암복호화 함수를 PUBLIC에 열지 않으므로, 0.3.0 이하 설치에서 PUBLIC 권한으로 호출하던 DB 계정은 권한을 따로 받아야 합니다.
추가
- 검색 인덱스 — 암호화한 열에서 같은 값을 찾는 결정적 인덱스(16진 64자). SQL
strcrypt_search_index(OracleSTRCRYPT_SEARCH_INDEX), Pythonsearch_index, Node.js·JavasearchIndex가 같은 값을 만듦. 같은 값끼리 인덱스가 같아 일치와 빈도가 드러남 - Python 3.9~3.14 각 버전용 wheel (Linux·Windows)
- PostgreSQL 확장 1.1, 이전 설치의
PUBLIC권한만 회수하는revoke_public.sql(Oracle·PostgreSQL) - 제3자 라이선스 고지
LICENSE-THIRD-PARTY와 소스 묶음
변경
- 동작 모드 이름
korean-standard추가. 이전 이름kcmvp-approved는 폐기 예정. 오류 문구를 문자열로 비교하던 코드는 새 이름에 맞춰야 함 - 기본 모드의 병렬 배치 암호화가 스레드 수만큼 빨라짐 (출력 형식은 그대로)
- 키가 없을 때의 오류 문구와 CLI 도움말이 권한 0600 키 파일(
STRCRYPT_KEY_FILE)을 먼저 안내 - Node.js 문자열 인자에 짝이 없는 서로게이트 문자가 있으면
RangeError로 거부
보안
- Oracle·PostgreSQL 설치가 암복호화 함수를
PUBLIC에 열어 모든 DB 계정이 복호화할 수 있던 문제 - 설치 안내의 검색용 열 예시가 키 없는 SHA-256 해시를 쓰던 문제. 추측할 수 있는 값은 후보 대입으로 되돌릴 수 있음. 검색 인덱스로 대체
수정
- Oracle
STRCRYPT_ENCRYPT·STRCRYPT_ENCRYPT_ALGO가 값 속 NUL(CHR(0)) 뒤를 버리고 앞부분만 암호화하던 문제. 이제 ORA-20502로 거부 - 다른 스레드가 키를 처음 읽는 중에 fork한 자식 프로세스가 멈추던 문제
알려진 제한
- MySQL·MariaDB UDF는 함수 단위 실행 권한이 없어 접속할 수 있는 모든 계정이 암복호화·검색 인덱스 UDF를 부를 수 있음. 암호문 테이블 조회 권한과 DB 계정 발급 범위로 제한
0.3.0 2026-09-25
0.2.0에서 만든 암호문과 암호화 파일은 그대로 복호화됩니다. Python·Node.js·Java 함수의 이름·인자·반환형과 C 공유 라이브러리의 기존 함수는 바뀌지 않았습니다. 기존 동작이 바뀐 항목은 아래 "변경"에 있고, 대부분 오류가 나는 경우의 처리 방식입니다.
추가
- 데이터 키(DEK) 관리 함수 — 고객사·사용자 등 주체별 데이터 키를 마스터 키로 감싼 값으로만 저장. 생성
generate_wrapped_dek, 마스터 키 교체용 재감싸기rewrap_dek, 조회wrapped_dek_info. 평문 데이터 키를 돌려주는 함수 없음 EncryptionContext— 감싼 데이터 키나 외부 키 관리 시스템(KMS)이 준 키로 암복호화하는 객체. 레코드별 AAD 배치 암복호화(순차·병렬) 포함. Python·Node.js·Java 공통 (Node.js·Java는generateWrappedDek형식 이름)- C 공유 라이브러리에 같은 기능의 함수 9개 추가 (기존 SQL 함수는 그대로)
- Python wheel에 타입 스텁(
.pyi,py.typed) 포함
변경
- Java 배포 JAR에서 예제 클래스 제외 (공개 API 클래스는 그대로)
- Java
generatePbeSalt·hardwareInfo·supportedAlgorithms·version의 네이티브 실패 예외를StrCryptException에서IllegalStateException으로 변경 - CLI에서 한쪽 옵션이 무시되던 조합(
-c와-q,-c와-o,decrypt의 Base64 인자와-f등)을 사용법 오류(종료 코드 2)로 처리 - CLI
--mode값 판정을STRCRYPT_MODE와 통일 —KcmvpApproved표기 허용, 앞뒤 공백이 있는 값은 거부 - CLI 대화형 입력이 곧바로 끝나면(EOF) 입력 오류(종료 코드 1)로 종료. 이전에는 빈 문자열을 암호화해 기본 출력 파일을 덮어씀
- PATH로 실행한 CLI도 실행 파일 옆
.hmac파일로 무결성 검사. 실행 파일을 교체하면.hmac파일도 함께 교체 - CLI에서
RUST_LOG설정 시 로그를 표준 오류로 출력 - 지원 플랫폼 명시 — 배포본은 Linux x86_64·Windows x64, Linux aarch64는 소스 빌드, Windows arm64는 미지원
보안
- AES-256-GCM 암호화 평문 한도를 NIST SP 800-38D 한도(2^36-32바이트)로 축소. 한도 근처 길이에서 키스트림이 재사용되던 문제. 복호화 한도는 그대로
- CLI
encrypt-file·decrypt-file결과 파일을 권한 0600으로 생성. 기본 ACL이 있는 디렉터리에서 복호화한 평문 파일을 다른 사용자가 읽을 수 있던 문제 - C 공유 라이브러리가 알 수 없는 알고리즘 이름을 로그에 그대로 기록하던 문제. 인자 순서를 바꿔 호출하면 평문이 로그에 남음
- 키 파일 권한 검사와 읽기 사이에 경로가 바뀌는 경쟁 차단
- 특정 이름(
deps등)의 디렉터리에 둔 라이브러리의 무결성 검사를 건너뛰던 문제 - 키 파일 내용, 파일·배치 복호화 평문, Java·Node.js 바인딩의 문자열 사본이 소거되지 않는 메모리에 남던 경로 제거
- 약한 키 경고 로그에서 키 통계 정보 제거
수정
- 병렬 파일 암복호화 중 다른 스레드가 동작 모드를 바꾸면 멈추던(교착) 문제
- Java 문자열에 짝이 없는 서로게이트 문자가 있으면 이모지 등이 U+FFFD로 바뀐 채 암호화되던 문제. 이제
StrCryptException으로 거부 - CLI
decrypt -f에서 파일 크기만큼 메모리를 확보하지 못하면 프로세스가 비정상 종료되던 문제. 이제 입출력 오류 - Oracle 대량 처리 C 래퍼의 반환값 누락(미정의 동작)
알려진 제한
- 전역 함수는 SEED-128-GCM·LEA-128-GCM·AEGIS-128L·ASCON-128에 마스터 키의 앞 16바이트만 사용. 마스터 키는 32바이트 전체를 난수로 생성. 파일 암호화와 감싼 데이터 키는 해당 없음
- 레코드 암호문은 키 확정(key-committing) 방식이 아님.
from_raw_key에는 신뢰하는 KMS가 준 키만 쓰고, 레코드마다 데이터 키 식별자를 함께 기록 - 키별 사용량 카운터는 프로세스 메모리에만 있음. 재시작·여러 프로세스에 걸친 누적은 사용하는 쪽에서 관리
- Windows에서 바인딩과 C 공유 라이브러리의 새 함수는 실행 시험하지 않음
- 마스터 키 하나로 모든 행을 암호화하는 SQL 함수·전역 함수는 한 키로 2^32회(모든 프로세스·재암호화 합)가 한계. 누계 2^31회 전에 키를 교체
0.2.0 2026-09-17
추가
- 레코드별 AAD를 받는 대량 바이트 배치 암복호화 — Python·Node.js·Java. 건수·바이트 상한 단위 분할 처리, 실패 레코드 번호 보고
- CLI
encrypt-batch·decrypt-batch— 한 줄 한 레코드(Base64 또는 데이터·AAD TSV), 오류 종류별 종료 코드 0~4 - C 공유 라이브러리 대량 배치 함수와 반환 코드 상수
- Oracle 대량 처리 패키지
STRCRYPT_BULK— 컬렉션 프로시저와 파이프라인 함수. 스칼라 함수와 암호문 형식 공통 - Windows 10·11 x64 배포본 — CLI, C 공유 라이브러리, Python wheel, Node.js 애드온, Java JNI 라이브러리. VC++ 재배포 패키지 불필요
변경
- 문자열 배치 복호화가 원소마다 헤더를 자동 감지. 헤더형과 레거시 암호문이 섞인 배열도 한 번에 복호화
- CLI를
--mode없이STRCRYPT_MODE만 주고 실행할 때의 모드 불일치 수정.STRCRYPT_MODE=non-approved실행의 기본 알고리즘이 AEGIS-128L로 바뀌어, 이 실행이 새로 만든 암호문은 기본 모드 프로세스에서 복호화되지 않음. 기존 ARIA-256-GCM 암호문은 두 모드 모두 복호화 - CLI 표준 입력 평문의 앞뒤 공백 보존(끝 줄바꿈만 제거). 같은 입력의 복호화 결과가 이전 버전과 다름
- CLI 출력 형식 변경 — 배너·구분선 제거,
라벨: 값정렬 출력. 출력 줄을 파싱하던 스크립트는 수정 필요 - CLI 알 수 없는
-a·--mode·migrate-file -t값의 종료 코드를 1에서 2로 변경 - AES-256-GCM·AES-256-GCM-SIV 길이 초과를 인증 실패 대신
PlaintextTooLong·AadTooLong으로 보고 - MySQL·MariaDB UDF — 키·알고리즘 문제는 행마다 NULL 대신 문장 오류(ERROR 1123)로 종료. 행 단위 실패는 그 행만 NULL. NUL 바이트가 든 문자열은 NULL
- Oracle 오류 번호를 ORA-29501·ORA-29502에서 ORA-20502·ORA-20503으로 변경. 이전 번호를 잡던 PL/SQL 예외 처리는 수정 필요
- Python 결과 메모리 할당 실패 시
MemoryError, Java 리스트 null 요소는NullPointerException으로 거부 - macOS 지원 제외
보안
- Unix에서 fork한 자식 프로세스가 부모와 같은 nonce를 만들던 문제
- CLI 결과 파일을 임시 파일(권한 0600)에 쓴 뒤 교체. 쓰기에 실패하면 기존 파일 보존. 복호화한 평문 파일이 umask 기본 권한(보통 0644)으로 생기던 문제
- CLI 출력 경로가 심볼릭 링크·FIFO·장치이면 따라가 쓰지 않고 저장 오류(종료 코드 1)로 종료.
-o /dev/stdout같은 사용은 불가 - UTF-8이 아닌
STRCRYPT_KEY_FILE·STRCRYPT_KEY값을 미설정으로 보고 다른 키로 암호화하던 문제. 이제 오류로 종료 - 바인딩과 암호 연산이 키·패스워드·평문 사본을 소거 없이 해제하던 경로 제거
수정
- fork한 자식 프로세스에서 병렬 작업이 무기한 대기하던 문제
STRCRYPT_MODE=non-approved에서 첫 호출 함수에 따라 16바이트 미만 키가 거부되고 이후 모든 암복호화가 실패하던 문제STRCRYPT_MODE=non-approved에서 첫 호출이 레거시 AES-256-GCM 암호문 복호화이면 인증 실패하던 문제- MySQL·MariaDB UDF에서 약 49KB를 넘는 값이 UNION·DISTINCT 쿼리에서 잘리던 문제. 잘린 암호문은 복호화 불가
- PostgreSQL 연동을 다시 설치하면 확장 함수를 쓰는 뷰·열 기본값·제약이 함께 삭제되던 문제
- Oracle 19c에서 SQL 함수 6개가 INVALID(PLS-00249·PLS-00251)가 되던 선언 오류와, 설치 SQL이 입력 대기로 멈추던 문제
- 약 232바이트를 넘는 출력 파일 이름에서 파일 암복호화가 실패하던 문제
- CLI 결과를 닫힌 파이프로 보낼 때 panic 메시지와 함께 종료하던 문제
- CLI
info가 키 파일만 설정한 경우 키 소스를 "설정되지 않음"으로 표시하던 문제 - Java 큰 리스트 배치에서 JNI 로컬 참조가 쌓이던 문제
알려진 제한
- PostgreSQL·MySQL·MariaDB는 SQL 배치 함수 없음. 대량 처리는 CLI나 바인딩으로 수행
- Oracle 대량 처리는 19c Enterprise Edition 단일 인스턴스에서 검증. RAC 등은 미검증이며, DB 문자집합이 AL32UTF8이 아니면 비 ASCII 레코드 하나가 청크 전체를 실패시킴
0.1.2 2026-07-17
보안
- 동작 모드 전환과 암호 연산의 정책 검사 강화
- 파일 복호화 실패 시 부분 평문을 최종 출력 경로에 남기지 않음
- 바인딩과 C 공유 라이브러리의 입력 검증, panic 차단, 비밀값 소거 강화
변경
- Python·Node.js·Java 기본 알고리즘을 동작 모드와 일치
- Java 배포본을 JAR와 플랫폼별 JNI 라이브러리를 묶은 압축 파일로 제공
0.1.1 2026-04-23
추가
- 국내 표준 알고리즘과 Python·Node.js·Java 바인딩을 포함한 첫 통합 버전