반응형
MySQL에서 가장 널리 사용되는 양방향 대칭키 암호화 함수는 AES_ENCRYPT()와 AES_DECRYPT()이다. 이 함수는 데이터를 암호화해서 안전하게 저장하고, 필요 시 복호화할 수 있다는 점에서 개인정보, 인증 정보, 금융 데이터 처리 등 민감한 데이터를 다룰 때 유용하다.
단방향 해시 함수와 달리, 암호화된 데이터를 원래 값으로 되돌릴 수 있다는 점이 가장 큰 차이점이다.

1. AES_ENCRYPT 함수란?
SELECT TO_BASE64(AES_ENCRYPT('secret', 'mykey')) AS 암호문;
- 첫 번째 인자: 암호화할 문자열
- 두 번째 인자: 대칭키(비밀키)
- 결과는 바이너리이므로 가공 없이 바로 출력하면 깨짐 → BASE64 인코딩 필요
- AES-128, AES-256 방식은 키 길이에 따라 자동 적용됨
2. AES_DECRYPT 함수란?
SELECT AES_DECRYPT(FROM_BASE64('암호문'), 'mykey');
- 암호화된 데이터를 원래 값으로 복호화
- 암호화에 사용된 키와 동일한 키를 사용해야 정상적으로 복호화된다.
- BASE64로 인코딩된 암호문은 FROM_BASE64()로 다시 디코딩한 뒤 사용
반응형
3. 기본 암복호화 예제
-- 암호화
SELECT TO_BASE64(AES_ENCRYPT('민감정보', 'key1234')) AS enc;
-- 복호화
SELECT AES_DECRYPT(FROM_BASE64('암호문'), 'key1234') AS 복호화결과;
- 암호문을 직접 복호화해보면 바이너리 → 문자열 처리 필요
- AES_DECRYPT() 결과도 바이너리이므로 CAST 또는 CONVERT로 문자형 처리가 필요할 수 있다.
SELECT CONVERT(AES_DECRYPT(FROM_BASE64('암호문'), 'key1234') USING utf8) AS 복호화;
4. 테이블에 적용하기
사용자 정보 저장 예시
INSERT INTO secure_users (username, encrypted_phone)
VALUES (
'user01',
TO_BASE64(AES_ENCRYPT('01012345678', 'secureKey!'))
);
복호화 조회
SELECT
username,
CONVERT(AES_DECRYPT(FROM_BASE64(encrypted_phone), 'secureKey!') USING utf8) AS phone
FROM secure_users;
- 데이터베이스에 저장할 때는 BLOB 또는 VARBINARY 컬럼 타입 사용 권장
5. 실무 팁: 키 관리가 핵심
- AES_ENCRYPT()와 AES_DECRYPT()는 모두 대칭키 기반이므로 키가 노출되면 데이터도 쉽게 복호화됨
- 키는 코드에 직접 넣기보다는 환경변수, Vault, Config Server 등을 통해 보안 영역에서 분리 관리하는 것이 필수다
- 키 교체 시에는 재암호화 작업도 고려해야 함
반응형
6. AES 암호화 시 주의할 점
| 주의사항 | 설명 |
| 키 길이 | 16, 24, 32바이트로 맞추는 것이 좋다 (AES-128, AES-192, AES-256) |
| 바이너리 처리 | 결과는 바이너리로 나오므로 반드시 BASE64 인코딩 후 저장 |
| 문자셋 충돌 | utf8, euckr 등의 문자셋에 따라 복호화 결과가 깨질 수 있음 |
| 키 노출 위험 | 하드코딩은 금물. 반드시 보안 저장소를 사용 |
7. 암호화 대상 필드 추천 예시
- 주민등록번호
- 휴대폰 번호
- 이메일 주소
- 결제 관련 정보
- API 키, 토큰
8. SHA2와의 차이
| 구분 | AES_ENCRYPT | SHA2 |
| 암호화 방식 | 양방향(복호화 가능) | 단방향 (복호화 불가) |
| 사용 목적 | 민감 정보 저장, 복호화 필요 시 | 비밀번호 저장, 인증 목적 |
| 키 필요 여부 | 필요 | 필요 없음 |
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-decrypt
반응형
'DB' 카테고리의 다른 글
| [MySQL] JSON 데이터 타입과 기본 구조 이해하기 (1) | 2025.07.28 |
|---|---|
| [MySQL] 암호화와 해시 함수 선택 가이드 (1) | 2025.07.28 |
| [MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기 (1) | 2025.07.28 |
| [MySQL] ENCODE와 DECODE 함수 사용법 🔐 (1) | 2025.07.28 |
| [MySQL] MD5와 SHA 해시 함수 비교와 실전 활용 (1) | 2025.07.25 |
| [MySQL] PASSWORD와 OLD_PASSWORD 함수 완전 해부 (0) | 2025.07.25 |
| [MySQL] 숫자, 날짜, 문자형 자유 변환 꿀팁 모음 (3) | 2025.07.25 |
| [MySQL] 날짜 → 문자열 변환: DATE_FORMAT 응용하기 🗓️ (2) | 2025.07.25 |