반응형
MySQL은 다양한 암호화와 해시 함수들을 제공하지만, 이들 함수는 목적, 특성, 보안 수준이 각각 다르다. 실제 실무에서는 데이터의 특성에 따라 적절한 암호화 또는 해시 방식을 선택하는 것이 중요하다.

1. 함수 종류 및 분류
| 함수명 | 분류 | 복호화 가능 | 설명 |
| PASSWORD() | 해시 | ❌ | MySQL 전용 비밀번호 해시 (사용 자제) |
| MD5(), SHA2() | 해시 | ❌ | 단방향 해시 함수, 비교적 빠름 |
| ENCODE() / DECODE() | 대칭 암호화 | ✅ | XOR 기반 간단 암호화 |
| AES_ENCRYPT() / AES_DECRYPT() | 대칭 암호화 | ✅ | 고급 암호화, 보안 강도 높음 |
| COMPRESS() / UNCOMPRESS() | 압축/해제 | ✅ | 데이터 용량 축소용 |
✅ 복호화가 필요한가? → 대칭 암호화 계열 사용.
✅ 비밀번호, 인증 등 비교만 필요? → 해시 계열 사용.
반응형
2. 목적에 따른 추천 함수
| 목적 | 추천 함수 |
| 사용자 비밀번호 저장 | SHA2(), MD5() (단방향 해시) |
| 민감 정보 저장 (복호화 필요) | AES_ENCRYPT(), AES_DECRYPT() |
| 내부 데이터 마스킹 | ENCODE(), DECODE() |
| 로그, 대용량 문자열 압축 | COMPRESS(), UNCOMPRESS() |
| 단순 데이터 무결성 체크 | MD5(), SHA1() 등 해시 함수 |
3. 각 함수별 장단점 비교
| 함수 | 장점 | 단점 |
| MD5() / SHA2() | 빠르고 간단, 비교 용이 | 복호화 불가, 보안 약점 존재 |
| AES_ENCRYPT() | 보안성 높음, 복호화 가능 | 키 관리 필요, 느릴 수 있음 |
| ENCODE() | 사용 간단, 빠른 처리 가능 | 보안성 낮음 |
| COMPRESS() | 저장 공간 절약 가능 | 검색 불가, 짧은 데이터에 비효율 |
| PASSWORD() | MySQL 내부에서 자동 적용 | 일반 사용 금지 (비권장) |
4. 실무 활용 시 고려사항
🔐 대칭키 암호화 시
- 키 관리가 핵심. 키가 노출되면 데이터도 바로 유출됨.
- 코드에 키를 하드코딩하지 말고, 환경 변수나 Vault 등을 이용해야 함.
- 키 변경 주기, 재암호화 절차까지 고려할 것.
🛡 해시 함수 사용 시
- 단순한 MD5()보다는 SHA2() 계열이 더 안전하다.
- 비밀번호 해시에는 가능하면 salt를 함께 적용할 것.
- 단방향이므로 복구 불가능 → 반드시 비교 기반 처리만 사용.
📦 압축 함수 사용 시
- 조회 성능보다 저장 공간 최적화가 우선일 때 적합.
- 자주 조회되거나 검색이 필요한 필드에는 비추천.
- 압축률 테스트를 통해 실제 이득을 확인한 뒤 적용할 것.
반응형
5. 함수 선택 체크리스트
- 복호화가 필요한가?
- ❌ → 해시 함수 (SHA2, MD5)
- ✅ → 암호화 함수 (AES_ENCRYPT, ENCODE)
- 데이터 보안이 중요한가?
- ✅ → AES_ENCRYPT, SHA2 계열 사용
- 데이터가 대용량인가?
- ✅ → COMPRESS 고려
- 마스킹 수준만 필요한가?
- ✅ → ENCODE로 간단하게 처리
6. 비밀번호 저장 방식 요약
❗ 보안이 가장 중요한 케이스: 사용자 비밀번호
✅ 올바른 저장 예:
-- SHA2로 해시 처리
INSERT INTO users (username, password_hash)
VALUES ('admin', SHA2('my_password', 256));
❌ 잘못된 저장 예:
-- 평문 저장, 절대 금지
INSERT INTO users (username, password_hash)
VALUES ('admin', 'my_password');
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html
https://dev.mysql.com/doc/refman/8.0/en/compression-functions.html
https://dev.mysql.com/doc/refman/8.0/en/password-hashing.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] JSON_SET, JSON_REPLACE로 값 수정하기 (1) | 2025.07.28 |
|---|---|
| [MySQL] JSON_EXTRACT와 -> 연산자로 값 조회하기 (2) | 2025.07.28 |
| [MySQL] JSON_OBJECT, JSON_ARRAY로 JSON 생성하기 (1) | 2025.07.28 |
| [MySQL] JSON 데이터 타입과 기본 구조 이해하기 (1) | 2025.07.28 |
| [MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기 (1) | 2025.07.28 |
| [MySQL] ENCODE와 DECODE 함수 사용법 🔐 (1) | 2025.07.28 |
| [MySQL] AES_ENCRYPT, AES_DECRYPT로 대칭키 암호화 🔐 (0) | 2025.07.25 |
| [MySQL] MD5와 SHA 해시 함수 비교와 실전 활용 (1) | 2025.07.25 |