SOFTWARE
MySQL 사용법
MySQL에서 UDF로 암복호화합니다. 여러 행을 한꺼번에 처리할 때는 DB 밖에서 CLI로 일정 크기씩 나눠 처리합니다.
시스템 요구 사항
- MySQL
- 8.4 LTS (MySQL 커뮤니티 RPM)에서 시험했습니다. 서비스 이름은 mysqld 기준입니다.
- DB 설정
- 서버와 연결 문자셋 utf8mb4
- DB 서버 OS
- Linux x86_64, glibc 2.28 이상 (예: RHEL·Rocky Linux 8 이상)
- 빌드 도구
- gcc, make, 서버와 같은 버전의 mysql-community-devel, curl, tar, sha256sum(coreutils 8.25 이상)
- 권한
- DB 서버의 sudo 가능한 OS 계정, DB의 root
MySQL 8.0과 9.x, Debian과 Ubuntu 패키지, 사용자 지정 plugin 디렉토리, 복제 구성, SELinux enforcing 구성은 시험하지 않았습니다. MariaDB는 MariaDB 사용법을 봅니다.
실행 위치
| 단계 | 실행 위치 | 계정 |
|---|---|---|
| 1. 사전 점검 ~ 4. 서버에 키 경로 전달 | DB 서버 셸 | sudo 가능한 OS 계정 |
| 5. UDF 등록 | DB 서버 셸에서 mysql | DB root |
| 6. 실행 권한 정리 | mysql | DB root |
| 7. 설치 확인 | mysql 등 SQL 클라이언트 | 암복호화를 쓸 애플리케이션 사용자, 애플리케이션 DB |
mysqld가 UDF 라이브러리 mysql_strcrypt.so를 불러오고, UDF가 같은 plugin 디렉토리의 libstrcrypt.so를 호출합니다.
라이브러리, 키 파일, 설정은 모두 DB 서버에 둡니다. 애플리케이션 서버에는 따로 설치할 것이 없습니다.
UDF는 서버 전역에 등록되므로 데이터베이스마다 설치하지 않습니다.
1. 사전 점검
ldd --version | head -1
mysqld --version
command -v mysql_config gcc make curl sha256sum tar sudo
systemctl is-active mysqld
mysql -u root -p -e "SELECT @@version, @@plugin_dir, @@character_set_server"
glibc 버전, MySQL 버전, 설치된 도구, 서비스 상태가 나오고 마지막 줄은 root 비밀번호를 물은 뒤 버전, plugin 디렉토리, 서버 문자셋(utf8mb4)을 출력합니다.
command -v는 설치된 도구만 출력합니다. @@plugin_dir가 mysql_config --plugindir 값과 다르면 2단계의 PLUGIN_DIR=를 @@plugin_dir 값으로 바꿉니다.
자주 발생하는 오류
| 증상 | 원인과 조치 |
|---|---|
| mysql_config: command not found | 개발 패키지가 없습니다. 2단계의 빌드 도구 설치 명령을 먼저 실행합니다. |
| ERROR 2002 (HY000): Can't connect to local MySQL server through socket | mysqld가 멈춰 있습니다. sudo systemctl start mysqld로 시작합니다. |
| ERROR 1045 (28000): Access denied for user | root 비밀번호가 틀렸습니다. |
| ldd (GNU libc) 2.17 등 2.28 미만 | 배포 파일을 쓸 수 없는 서버입니다. |
2. 라이브러리 빌드와 설치
빌드 도구가 없을 때만
sudo dnf install -y gcc make mysql-community-devel-$(rpm -q --qf '%{VERSION}' mysql-community-server)개발 패키지를 서버와 같은 버전으로 지정해 설치합니다. 버전을 빼면 최신 버전이 설치됩니다.
다운로드·검증·빌드·설치
mkdir -p ~/strcrypt-mysql && cd ~/strcrypt-mysql
curl -fLO https://www.cubiware.co.kr/api/download/strcrypt/0.3.1/libstrcrypt.so
curl -fLO https://www.cubiware.co.kr/api/download/strcrypt/0.3.1/libstrcrypt.so.hmac
curl -fLO https://www.cubiware.co.kr/api/download/strcrypt/0.3.1/strcrypt-mysql-0.3.1.tar.gz
curl -fLO https://www.cubiware.co.kr/api/download/strcrypt/0.3.1/SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
tar xzf strcrypt-mysql-0.3.1.tar.gz && cd strcrypt-mysql-0.3.1
PLUGIN_DIR=$(mysql_config --plugindir)
sudo install -m 755 ../libstrcrypt.so "$PLUGIN_DIR"/
sudo install -m 644 ../libstrcrypt.so.hmac "$PLUGIN_DIR"/
make STRCRYPT_LIB_DIR="$PLUGIN_DIR" STRCRYPT_INCLUDE_DIR=.
sudo install -m 755 mysql_strcrypt.so "$PLUGIN_DIR"/
ldd "$PLUGIN_DIR/mysql_strcrypt.so" | grep strcrypt
UDF는 DB 서버의 MySQL 헤더로 빌드해야 하므로 소스로 제공합니다. 빌드는 ~/strcrypt-mysql 아래에서 하고, 라이브러리 3개를 모두 plugin 디렉토리에 둡니다.
libstrcrypt.so를 plugin 디렉토리에 먼저 설치하고 그 경로로 빌드해야 UDF 라이브러리가 홈 디렉토리 경로를 참조하지 않습니다.
마지막 줄이 libstrcrypt.so => /usr/lib64/mysql/plugin/libstrcrypt.so를 출력하면 성공입니다.
자주 발생하는 오류
| 증상 | 원인과 조치 |
|---|---|
| make: command not found | 빌드 도구 설치 명령을 먼저 실행합니다. |
| make: gcc: No such file or directory | gcc가 설치되지 않았습니다. |
| Error: mysql_config or mariadb_config not found. | mysql-community-devel이 설치되지 않았습니다. |
| Error: libstrcrypt.so not found. / Run 'cargo build --release' in ... first. | make 앞의 libstrcrypt.so 설치 줄을 빠뜨렸거나 PLUGIN_DIR이 비었습니다. 안내의 cargo 명령은 따르지 않습니다. |
| sha256sum 결과에 FAILED | 내려받는 중에 파일이 손상됐습니다. 그 파일을 다시 내려받습니다. |
3. 키 파일 생성
sudo install -d -o mysql -g mysql -m 700 /etc/strcrypt
head -c 24 /dev/urandom | base64 | head -c 32 | sudo -u mysql tee /etc/strcrypt/strcrypt.key > /dev/null
sudo chmod 600 /etc/strcrypt/strcrypt.key
sudo -u mysql wc -c /etc/strcrypt/strcrypt.key
32바이트 키를 mysql 계정만 읽을 수 있는 파일로 만듭니다. 마지막 줄이 32 /etc/strcrypt/strcrypt.key를 출력해야 합니다.
두 번째 줄은 기존 키 파일을 덮어쓰므로 키가 이미 있으면 다시 실행하지 않습니다. 키는 SQL 인자나 테이블로 전달하지 않습니다.
키를 잃으면 암호문을 복구할 수 없으니 키를 따로 백업해 두세요.
자주 발생하는 오류
키 파일 문제는 5단계 이후 함수를 호출할 때 ERROR 1123 (HY000): Can't initialize function 'strcrypt_encrypt'; 환경 변수 오류: 뒤에 붙어 나옵니다.
키 파일을 고친 뒤에는 mysqld를 다시 시작해야 반영됩니다.
| 증상 | 원인과 조치 |
|---|---|
| 권한 오류: 키 파일 권한은 0600 이어야 합니다 | chmod 600으로 고치고 mysqld를 다시 시작합니다. |
| 파일 오류 (/etc/strcrypt/strcrypt.key): Permission denied | 키 파일이나 /etc/strcrypt의 소유자가 mysql이 아닙니다. |
| 잘못된 키 파일: 키 파일이 비어 있습니다 | 빈 파일입니다. 두 번째 줄을 다시 실행합니다. |
| 잘못된 키 파일: 키 파일 내용은 최대 32바이트여야 합니다 | 32바이트를 넘는 값을 넣었습니다. 두 번째 줄의 명령으로 다시 만듭니다. |
4. 서버에 키 경로 전달
sudo mkdir -p /etc/systemd/system/mysqld.service.d
printf '[Service]\nEnvironment=STRCRYPT_KEY_FILE=/etc/strcrypt/strcrypt.key\n' | sudo tee /etc/systemd/system/mysqld.service.d/strcrypt.conf
sudo systemctl daemon-reload
sudo systemctl restart mysqld
sudo systemctl show mysqld -p Environment
systemd 설정 조각 파일로 mysqld 서비스에 환경 변수 STRCRYPT_KEY_FILE을 넘깁니다. 마지막 줄의 Environment=에 STRCRYPT_KEY_FILE=/etc/strcrypt/strcrypt.key가 있으면 반영된 것입니다.
재시작하는 동안 DB 접속이 잠시 끊깁니다. 셸에서 export한 값은 서버에 전달되지 않습니다.
국내 표준 외 알고리즘을 쓰려면 Environment=STRCRYPT_MODE=non-approved 줄을 추가합니다.
자주 발생하는 오류
| 증상 | 원인과 조치 |
|---|---|
| ERROR 1123 ... STRCRYPT_KEY is required. create a key file ... | 키 경로가 서버에 전달되지 않았습니다. 메시지가 권하는 방법은 따르지 않습니다. |
| Warning: The unit file ... changed on disk. Run 'systemctl daemon-reload' | daemon-reload를 빠뜨렸습니다. 실행한 뒤 다시 시작합니다. |
| 파일 오류 (...): No such file or directory | 설정 파일의 키 경로에 오타가 있습니다. |
5. UDF 등록
cd ~/strcrypt-mysql/strcrypt-mysql-0.3.1
mysql -u root -p < install.sql install.sql이 함수 6개를 등록하고 마지막에 암복호화 시험을 실행합니다. 출력에 [OK]와 === 설치 완료 ===가 나오면 성공입니다.
등록은 서버를 다시 시작해도 유지되고, 스크립트는 다시 실행할 수 있습니다. 스크립트는 기존 함수를 먼저 지우므로 라이브러리 파일이 없는 상태에서 실행하면 함수가 모두 사라집니다.
자주 발생하는 오류
| 증상 | 원인과 조치 |
|---|---|
| 끝에 ERROR 1123 ... Can't initialize function 'strcrypt_encrypt'; 환경 변수 오류: ... | 함수는 등록됐고 키를 읽지 못했습니다. 3, 4단계를 고치고 mysqld를 다시 시작한 뒤 스크립트를 다시 실행합니다. |
| ERROR 1123 ... 암호모듈이 에러 상태입니다: IntegrityFailure | libstrcrypt.so.hmac이 libstrcrypt.so와 짝이 맞지 않거나 mysql 계정이 읽을 수 없습니다. 같은 배포본의 두 파일을 함께 둡니다. |
| ERROR 1126 (HY000): Can't open shared library 'mysql_strcrypt.so' ... mysql_strcrypt.so: cannot open shared object file | plugin 디렉토리에 mysql_strcrypt.so가 없습니다. 2단계를 확인합니다. |
| ERROR 1126 ... libstrcrypt.so: cannot open shared object file | plugin 디렉토리에 libstrcrypt.so가 없습니다. |
| ERROR 1044 (42000): Access denied for user ... to database 'mysql' | root가 아닌 계정으로 실행했습니다. |
| 재시작 후 ERROR 1305 (42000): FUNCTION appdb.strcrypt_encrypt does not exist | 서버 시작 때 라이브러리를 불러오지 못했습니다. 파일을 복구하고 mysqld를 다시 시작합니다. |
6. 실행 권한 정리
MySQL에는 UDF 실행 권한이 없어 복호화 함수를 호출할 사용자를 제한할 수 없습니다.
DB에 접속할 수 있는 계정이면 권한이 USAGE뿐이어도 암호문 문자열을 복호화합니다. 대신 암호문 컬럼과 키 파일에 접근할 수 있는 계정을 제한합니다.
| 대상 | 제한 방법 |
|---|---|
| UDF 호출 | 제한할 수 없습니다. 접속할 수 있는 모든 계정이 6개 함수를 호출합니다. 다른 곳에서 얻은 암호문 문자열도 복호화됩니다. |
| GRANT·REVOKE EXECUTE | UDF에 적용되지 않습니다. |
| 암호문 컬럼 읽기 | 테이블과 컬럼 권한으로 막습니다. 권한이 없으면 ERROR 1143 (42000): SELECT command denied ... for column이 납니다. |
| 함수 등록·삭제 | mysql 스키마에 INSERT, DELETE 권한이 있는 계정만 할 수 있습니다. 아래 조회로 점검합니다. |
| SQL로 키 파일 읽기 | secure_file_priv를 비우지 않습니다. 커뮤니티 RPM의 기본값은 /var/lib/mysql-files/입니다. 비워 두면 FILE 권한이 있는 계정이 LOAD DATA INFILE로 서버 계정이 읽을 수 있는 파일을 읽습니다. |
함수를 등록·삭제할 수 있는 계정 점검 (root)
SELECT user, host FROM mysql.user WHERE Insert_priv = 'Y' OR Delete_priv = 'Y';
SELECT user, host, db FROM mysql.db WHERE db = 'mysql' AND (Insert_priv = 'Y' OR Delete_priv = 'Y');
SELECT user, host, table_name, table_priv FROM mysql.tables_priv WHERE db = 'mysql' AND table_name = 'func';첫 조회에 root | localhost만 나오고 나머지 두 조회에 결과가 없으면 관리자만 함수를 바꿀 수 있습니다. 다른 계정이 나오면 그 권한을 회수합니다.
7. 설치 확인
문자셋과 기본 암복호화
SELECT @@character_set_client, @@character_set_connection;
SELECT CONVERT(strcrypt_decrypt(strcrypt_encrypt('test')) USING utf8mb4) AS result;왕복 시험 (1,000행, 시험 테이블은 끝에서 삭제)
CREATE TABLE strcrypt_selftest (id INT PRIMARY KEY, val VARCHAR(100), enc VARCHAR(400));
INSERT INTO strcrypt_selftest (id, val)
WITH RECURSIVE seq (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM seq WHERE n < 1000)
SELECT n, CONCAT('row-', n, '-홍길동') FROM seq;
UPDATE strcrypt_selftest SET enc = strcrypt_encrypt_algo(val, 'aria256gcm');
SELECT COUNT(*) AS CHECKED,
SUM(NOT (CAST(strcrypt_decrypt(enc) AS BINARY) <=> CAST(val AS BINARY))) AS MISMATCHES
FROM strcrypt_selftest;
DROP TABLE strcrypt_selftest;
애플리케이션 사용자로 애플리케이션 DB에 접속해 실행합니다(예: mysql -u app_user -p appdb). 첫 조회는 utf8mb4 | utf8mb4, 두 번째는 test,
왕복 시험은 CHECKED 1000 | MISMATCHES 0이 나와야 합니다. 왕복 시험에는 CREATE, DROP 권한이 필요합니다.
자주 발생하는 오류
| 증상 | 원인과 조치 |
|---|---|
| latin1 | latin1 | UTF-8 로케일이 아닌 셸입니다. mysql에 --default-character-set=utf8mb4를 붙여 접속합니다. |
| 오류 문구의 한글이 \D658\ACBD처럼 보임 | 위와 같은 원인입니다. |
| 결과가 0x74657374처럼 16진으로 보임 | CONVERT(... USING utf8mb4)를 뺐습니다. 결과 문자셋이 binary입니다. |
SQL 함수
CREATE TABLE members (id INT PRIMARY KEY, ssn VARCHAR(20), ssn_enc VARCHAR(80));
INSERT INTO members (id, ssn, ssn_enc)
VALUES (1, '900101-1234567', strcrypt_encrypt_algo('900101-1234567', 'aria256gcm'));
INSERT INTO members (id, ssn) VALUES (2, '850505-2345678'), (3, NULL);
UPDATE members SET ssn_enc = strcrypt_encrypt_algo(ssn, 'aria256gcm')
WHERE ssn_enc IS NULL AND ssn IS NOT NULL;
SELECT id, CONVERT(strcrypt_decrypt(ssn_enc) USING utf8mb4) AS ssn FROM members ORDER BY id;
SELECT id, CONVERT(strcrypt_decrypt(strcrypt_encrypt_algo(CAST(CONCAT('EMP-', id) AS CHAR), 'seed128gcm')) USING utf8mb4) AS emp_code
FROM members ORDER BY id;
SELECT COUNT(*) AS failed_rows FROM members WHERE ssn_enc IS NOT NULL AND strcrypt_decrypt(ssn_enc) IS NULL;
SELECT, INSERT, UPDATE 어디서나 일반 함수처럼 씁니다. 입력이 NULL이면 결과도 NULL입니다. 결과 문자셋이 binary라 문자열로 보려면 CONVERT(... USING utf8mb4)로 감싸고, 값을 비교할 때는 CAST(... AS BINARY)로 바이트를 비교합니다.
암호화할 때는 strcrypt_encrypt_algo로 알고리즘을 지정합니다. 알고리즘을 뺀 strcrypt_encrypt의 암호문은 헤더가 없어, 서버의 동작 모드를 바꾸면 복호화되지 않습니다.
숫자 컬럼이 섞인 식은 CAST(... AS CHAR)로 감싸 넘깁니다. MySQL 8.4에서 CONCAT('A-', id)처럼 숫자가 섞인 식을 UDF 인자로 바로 넘기면
둘째 행부터 인자가 깨져, 한글 값은 NULL이 되고 ASCII 값은 오류 없이 틀린 값이 암호화됩니다. 위 예의 emp_code 조회가 우회 방법입니다.
한 행의 암복호화가 실패하면 문장 전체가 멈추지 않고 그 행만 NULL이 됩니다. 변조된 암호문, 다른 키, UTF-8이 아닌 입력이 여기에 해당하며 NULL 입력과 구분되지 않습니다. 마지막 조회처럼 암호문이 있는데 복호화 결과가 NULL인 행 수를 세어 확인합니다.
암호문은 같은 값이어도 매번 달라서 인덱스로 찾을 수 없습니다. 같은 값 검색이 필요하면 strcrypt_search_index(값, '테이블.열')
결과를 검색용 컬럼에 저장하고 인덱스를 겁니다. 조회할 때도 같은 함수로 검색어의 인덱스를 만들어 비교합니다. 키 없는 SHA-256 해시는 쓰지 않습니다.
주민번호처럼 추측할 수 있는 값은 후보를 모두 해시해 보면 원래 값이 나옵니다. 검색용 컬럼은 같은 값을 가진 행이 어느 것인지 드러내므로 필요한 컬럼에만 두고,
UDF는 함수별 실행 권한이 없어 접속할 수 있는 모든 계정이 이 함수로 후보 값의 인덱스를 만들어 맞춰 볼 수 있다는 점을 감안합니다.
대량 처리
MySQL에는 여러 행을 한 번에 받는 UDF가 없습니다. UDF는 행마다 한 번씩 호출되는 구조라 SQL 안에서 호출 횟수를 줄일 수 없기 때문입니다.
여러 행은 DB 밖에서 기본 키 순서로 청크를 조회해 CLI로 한 번에 암복호화하고, 기본 키 조건으로 반영합니다. CLI로 만든 암호문은 UDF로, UDF로 만든 암호문은 CLI로 복호화할 수 있습니다.
이 방법은 서버의 local_infile 설정이 필요 없고 임시 파일을 만들지 않습니다.
CLI 준비 (2단계의 ~/strcrypt-mysql에서)
cd ~/strcrypt-mysql
curl -fLO https://www.cubiware.co.kr/api/download/strcrypt/0.3.1/strcrypt
curl -fLO https://www.cubiware.co.kr/api/download/strcrypt/0.3.1/strcrypt.hmac
sha256sum -c --ignore-missing SHA256SUMS
sudo install -m 755 strcrypt /usr/local/bin/strcrypt
sudo install -m 644 strcrypt.hmac /usr/local/bin/strcrypt.hmac
mysql_config_editor set --login-path=strcrypt_batch --host=localhost --user=app_user --password
마지막 줄은 애플리케이션 사용자의 접속 정보를 ~/.mylogin.cnf에 저장하고 비밀번호를 묻습니다. 키 파일이 mysql 계정 소유이므로 아래 스크립트는 CLI를 sudo -u mysql로 실행합니다.
sudo는 /usr/local/bin을 경로에서 빼므로 CLI를 절대 경로로 부릅니다.
기존 컬럼 일괄 암호화
set -euo pipefail
last=0
while :; do
rows=$(mysql --login-path=strcrypt_batch -N -B appdb -e "SELECT id, REPLACE(TO_BASE64(ssn), '\n', '') FROM customers WHERE id > $last AND ssn IS NOT NULL ORDER BY id LIMIT 1000")
[ -n "$rows" ] || break
enc=$(printf '%s\n' "$rows" | cut -f2 | sudo -u mysql env STRCRYPT_KEY_FILE=/etc/strcrypt/strcrypt.key /usr/local/bin/strcrypt encrypt-batch -a aria256gcm)
[ "$(printf '%s\n' "$enc" | wc -l)" -eq "$(printf '%s\n' "$rows" | wc -l)" ]
paste <(printf '%s\n' "$rows" | cut -f1) <(printf '%s\n' "$enc") |
awk -F'\t' 'BEGIN { print "START TRANSACTION;" } { printf "UPDATE customers SET ssn_enc = '\''%s'\'' WHERE id = %s;\n", $2, $1 } END { print "COMMIT;" }' |
mysql --login-path=strcrypt_batch appdb
last=$(printf '%s\n' "$rows" | tail -n 1 | cut -f1)
echo "updated up to id $last"
done
파일로 저장해 bash로 실행합니다. 대화형 셸에 붙여 넣으면 set -e 때문에 오류가 날 때 셸이 닫힙니다.
1,000행씩 평문을 Base64로 조회해 encrypt-batch로 암호화하고, 청크마다 한 트랜잭션으로 기본 키 UPDATE를 보냅니다. 청크마다 updated up to id ...를 출력합니다.
실패하면 반영 전에 멈추고, 이미 커밋한 청크는 남습니다. 다시 실행하면 처음부터 모든 행을 다시 암호화합니다.
TO_BASE64는 76자마다 줄바꿈을 넣습니다.REPLACE로 지우지 않으면 긴 값이 여러 레코드로 나뉩니다.- NULL은 조회 결과에서 문자열
NULL이 되고, 이 문자열도 Base64로 읽혀 엉뚱한 값이 암호화되므로ssn IS NOT NULL조건을 뺄 수 없습니다.
결과 대조 (app_user로 실행)
SELECT COUNT(*) AS CHECKED,
SUM(NOT (CAST(strcrypt_decrypt(ssn_enc) AS BINARY) <=> CAST(ssn AS BINARY))) AS MISMATCHES,
SUM(ssn IS NOT NULL AND ssn_enc IS NULL) AS NOT_ENCRYPTED
FROM customers;MISMATCHES와 NOT_ENCRYPTED가 0이면 모든 행이 암호화됐고 UDF로 복호화된 것입니다.
UDF가 만든 암호문을 CLI로 복호화
set -euo pipefail
rows=$(mysql --login-path=strcrypt_batch -N -B appdb -e "SELECT strcrypt_encrypt_algo(ssn, 'seed128gcm'), REPLACE(TO_BASE64(ssn), '\n', '') FROM customers WHERE ssn IS NOT NULL ORDER BY id LIMIT 1000")
dec=$(printf '%s\n' "$rows" | cut -f1 | sudo -u mysql env STRCRYPT_KEY_FILE=/etc/strcrypt/strcrypt.key /usr/local/bin/strcrypt decrypt-batch)
paste <(printf '%s\n' "$dec") <(printf '%s\n' "$rows" | cut -f2) | awk -F'\t' '$1 != $2 { bad++ } END { printf "CHECKED %d MISMATCHES %d\n", NR, bad + 0 }'decrypt-batch는 평문을 Base64로 내보내므로 원본의 Base64와 비교합니다. CHECKED 1000 MISMATCHES 0이 나와야 합니다.
제한 사항
- UDF 호출을 사용자별로 제한할 수 없습니다. 암호문 컬럼의 읽기 권한으로 보호합니다.
- 평문은 UTF-8이어야 하고 NUL 바이트가 없어야 합니다. latin1 컬럼 값은
CONVERT(값 USING utf8mb4)로 넘깁니다. - 클라이언트로 받는 결과는
max_allowed_packet보다 작아야 합니다. 서버 안에서 테이블에 저장하는 값은 이 한도를 넘어도 만들어집니다. - 키 파일이나 서버 환경 변수를 바꾸면 mysqld를 다시 시작한 뒤부터 반영됩니다.
- 같은 값도 암호화할 때마다 암호문이 달라지므로 암호문 컬럼으로는 검색하거나 인덱스를 만들 수 없습니다. 검색이 필요하면 해시 컬럼을 따로 둡니다.
- 평문은 DB 서버의 mysqld 프로세스 메모리를 거칩니다.
API 레퍼런스
| 함수 | 설명 |
|---|---|
strcrypt_encrypt_algo(input, algorithm) | 지정한 알고리즘으로 암호화해 Base64 문자열을 돌려줌. 새 데이터에 권장 |
strcrypt_decrypt(encrypted) | 복호화. 암호문 앞의 헤더로 알고리즘을 자동으로 인식 |
strcrypt_decrypt_algo(encrypted, algorithm) | 알고리즘을 지정해 복호화. 알고리즘이 다르면 NULL, algorithm이 NULL이면 자동 인식 |
strcrypt_encrypt(input) | 알고리즘 헤더 없는 호환 형식으로 암호화. 서버 동작 모드가 알고리즘을 정함 |
strcrypt_search_index(value, domain) | 같은 값 검색용 인덱스(16진 64자). domain은 열을 구분하는 문자열(예: customers.ssn). Python·Node.js·Java 바인딩과 같은 값 |
strcrypt_algorithms() / strcrypt_hw_info() | 알고리즘 이름 목록, 하드웨어 가속 정보(JSON 문자열) |
암호화와 복호화 결과의 문자셋은 binary입니다. 키 오류, 라이브러리 오류, 상수로 준 허용되지 않는 알고리즘은 문장 전체를 ERROR 1123으로 멈추고, 그 밖의 행 단위 실패는 그 행만 NULL로 돌려줍니다.
시험 환경
| 환경 | 방법 |
|---|---|
| Rocky Linux 9.8 (glibc 2.34), MySQL 8.4 LTS 커뮤니티 RPM, systemd | 이 페이지의 배포 파일과 명령을 그대로 실행 |
1~7단계, SQL 함수 예시, 대량 처리 예시(2,500행 왕복, NULL, 빈 문자열, 한글 값 포함), USAGE 권한 계정의 호출 가능 여부와 컬럼 권한 차단을 확인했습니다(2026-09-17).