반응형
MySQL에서 제공하는 간단한 대칭 암호화 함수인 ENCODE()와 DECODE()는 비교적 오래된 방식이지만, 간단한 문자열 암호화에 여전히 사용되고 있다. 보안 수준은 높지 않지만 내부 시스템 데이터 보호, 간단한 식별자 마스킹 등 용도에 따라 활용이 가능하다.

1. ENCODE 함수란?
SELECT TO_BASE64(ENCODE('mysqltest', 'mysecretkey'));
-- 결과 예시: QNLfB0lTAA1aBA==
- ENCODE(str, pass_str)
- str: 암호화할 문자열
- pass_str: 대칭키 역할을 하는 키 문자열
- 암호화된 결과는 바이너리 형식이므로 반드시 TO_BASE64() 등으로 인코딩해야 저장하거나 확인이 가능하다.
2. DECODE 함수란?
SELECT DECODE(FROM_BASE64('QNLfB0lTAA1aBA=='), 'mysecretkey');
-- 결과: mysqltest
- DECODE(crypt_str, pass_str)
- crypt_str: 암호화된 바이너리 문자열
- pass_str: 암호화에 사용한 동일한 키
- 복호화할 때는 암호화에 사용한 정확히 같은 키 문자열을 입력해야 올바른 결과가 나온다.
반응형
3. ENCODE / DECODE 기본 예제
-- 암호화
SELECT TO_BASE64(ENCODE('123456-7890123', 'secureKey')) AS 암호문;
-- 복호화
SELECT DECODE(FROM_BASE64('암호문'), 'secureKey') AS 원본값;
- 실제 저장 시에는 암호화된 값을 VARBINARY, BLOB 형식의 컬럼에 저장하거나, BASE64로 인코딩해서 문자열로 저장하면 관리가 편하다.
4. 테이블에 적용하기
암호화 저장
INSERT INTO member_data (user_id, encrypted_name)
VALUES ('kim123', TO_BASE64(ENCODE('김철수', 'simpleKey')));
복호화 조회
SELECT
user_id,
DECODE(FROM_BASE64(encrypted_name), 'simpleKey') AS real_name
FROM member_data;
5. ENCODE/DECODE vs AES_ENCRYPT 비교
| 항목 | ENCODE/DECODE | AES_ENCRYPT/AES_DECRYPT |
| 암호화 수준 | 낮음 (간단한 XOR 방식) | 강력한 블록 암호화 (AES 표준) |
| 복호화 가능 | O | O |
| 키 관리 | 평문 문자열 | 바이트 길이 기준 키 관리 필요 |
| 권장 용도 | 내부 마스킹용, 빠른 처리용 | 민감 정보 보호용 |
| 안전성 | 낮음 | 높음 |
✅ ENCODE/DECODE는 실질적인 보안을 위한 암호화보다는 간단한 난독화 수준으로만 사용해야 한다.
6. 실무에서의 활용 팁
- 관리자용 내부 시스템에서 식별자 마스킹
- 로그 기록 시 민감 정보 간접 암호화
- 일정 기간 후 파기될 데이터 암호화 처리
단, 외부에 노출되거나 장기 보관되는 정보는 AES_ENCRYPT 또는 SHA2 기반 방식 사용이 필수다.
7. 문자셋 인코딩 주의사항
- ENCODE()/DECODE()는 내부적으로 XOR 연산 기반이기 때문에 문자셋에 따라 결과가 깨질 수 있음
- 대부분의 경우 utf8mb4 설정을 유지하고, BASE64로 저장하는 방식이 가장 안전하다.
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_encode
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_decode
반응형
'DB' 카테고리의 다른 글
| [MySQL] JSON_OBJECT, JSON_ARRAY로 JSON 생성하기 (1) | 2025.07.28 |
|---|---|
| [MySQL] JSON 데이터 타입과 기본 구조 이해하기 (1) | 2025.07.28 |
| [MySQL] 암호화와 해시 함수 선택 가이드 (1) | 2025.07.28 |
| [MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기 (1) | 2025.07.28 |
| [MySQL] AES_ENCRYPT, AES_DECRYPT로 대칭키 암호화 🔐 (0) | 2025.07.25 |
| [MySQL] MD5와 SHA 해시 함수 비교와 실전 활용 (1) | 2025.07.25 |
| [MySQL] PASSWORD와 OLD_PASSWORD 함수 완전 해부 (0) | 2025.07.25 |
| [MySQL] 숫자, 날짜, 문자형 자유 변환 꿀팁 모음 (3) | 2025.07.25 |