본문 바로가기

SOFTWARE

MySQL 사용법

MySQL에서 UDF로 암복호화합니다. 여러 행을 한꺼번에 처리할 때는 DB 밖에서 CLI로 일정 크기씩 나눠 처리합니다.

0.3.1갱신 2026-09-27MIT · Linux x86_64

시스템 요구 사항

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 서버 셸에서 mysqlDB root
6. 실행 권한 정리mysqlDB 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 socketmysqld가 멈춰 있습니다. sudo systemctl start mysqld로 시작합니다.
ERROR 1045 (28000): Access denied for userroot 비밀번호가 틀렸습니다.
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 directorygcc가 설치되지 않았습니다.
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 ... 암호모듈이 에러 상태입니다: IntegrityFailurelibstrcrypt.so.hmac이 libstrcrypt.so와 짝이 맞지 않거나 mysql 계정이 읽을 수 없습니다. 같은 배포본의 두 파일을 함께 둡니다.
ERROR 1126 (HY000): Can't open shared library 'mysql_strcrypt.so' ... mysql_strcrypt.so: cannot open shared object fileplugin 디렉토리에 mysql_strcrypt.so가 없습니다. 2단계를 확인합니다.
ERROR 1126 ... libstrcrypt.so: cannot open shared object fileplugin 디렉토리에 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 EXECUTEUDF에 적용되지 않습니다.
암호문 컬럼 읽기테이블과 컬럼 권한으로 막습니다. 권한이 없으면 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 | latin1UTF-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).

이미지를 클릭하면 원본 크기 · 바깥 클릭이나 Esc로 닫기