반응형
MySQL에서 제공하는 대표적인 해시 함수는 MD5()와 SHA1(), SHA2() 시리즈다. 이 함수들은 텍스트를 고정 길이의 해시값으로 변환해 데이터 위변조 감지, 인증, 무결성 검증 등에 활용된다. 하지만 보안 수준과 용도에 따라 선택이 매우 중요하다.

1. MD5 함수란?
SELECT MD5('mypassword');
-- 결과: 34819d7beeabb9260a5c854bc85b3e44
- 128비트(16바이트) 해시를 생성
- 32자리 소문자 16진수 문자열 반환
- 빠르고 가볍지만, 충돌 가능성 높아 보안성 낮음
- 여전히 파일 무결성 체크, 캐시 키 생성 등에 사용
2. SHA 함수 종류
SHA1()
SELECT SHA1('mypassword');
-- 결과: a7e017cfd0f3ca3b45f18cf1db4ef5baec6ecb82
- 160비트(20바이트) 해시 생성
- 보안성은 MD5보다 우수하지만, 이미 충돌 사례 존재
SHA2()
SELECT SHA2('mypassword', 256);
-- 결과: 89b4f314dc44d38a2ab99945cebc674c41d90d92345bb229a0fba310820f5d98
- SHA2(str, hash_length) 형식
- hash_length는 224, 256, 384, 512 중 선택 가능
- 가장 많이 쓰는 값은 SHA2(str, 256)
반응형
3. MD5 vs SHA1 vs SHA2 비교표
| 함수명 | 길이 (bit) | 결과 길이 | 보안성 | 비고 |
| MD5 | 128 | 32자 | 낮음 | 빠르지만 충돌 발생 |
| SHA1 | 160 | 40자 | 중간 | 더 이상 권장되지 않음 |
| SHA2(256) | 256 | 64자 | 강력 | 가장 일반적으로 사용됨 |
| SHA2(512) | 512 | 128자 | 매우 강력 | 데이터 인증/보안 적합 |
4. 실무 활용 예제
비밀번호 단방향 해싱
INSERT INTO users (username, password_hash)
VALUES ('admin', SHA2('admin1234', 256));
- 사용자가 입력한 비밀번호를 해시한 값을 DB에 저장
- 로그인 시에도 같은 방식으로 SHA2 해시 후 비교
단, 실제 서비스에서는 MySQL보다는 애플리케이션 레이어에서 bcrypt/argon2 등 강력한 알고리즘을 적용하는 것이 일반적이다.
캐시 키 생성
SELECT CONCAT('user_', MD5(CONCAT(user_id, '-', created_at))) AS cache_key
FROM users;
- 고유 데이터를 해시로 변환하여 중복되지 않는 키 생성
데이터 무결성 검증
-- 원본 데이터와 해시값을 함께 저장
INSERT INTO files (filename, md5hash)
VALUES ('file.zip', MD5(file_blob));
- 추후 다운로드 후 다시 MD5 비교로 위변조 여부 확인
5. 주의사항 및 권장 사용
| 상황 | 권장 해시 함수 |
| 비밀번호 암호화 (권장 X) | SHA2 (또는 외부 bcrypt) |
| 무결성 검증 (파일, 데이터) | MD5 또는 SHA1 (비보안 목적) |
| 인증 토큰, 캐시 키 생성 | MD5 or SHA2 |
| 보안 민감 데이터 처리 | SHA2(256) 이상 또는 외부 암호화 |
6. SHA2가 더 안전한 이유
- 해시 길이가 길수록 충돌 가능성 낮아짐
- SHA2는 NSA 주도 하에 설계된 안전한 구조
- 실무에서는 SHA2(256) 이상을 사용해야 암호화된 데이터의 안정성이 보장된다.
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_md5
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_sha2
반응형
'DB' 카테고리의 다른 글
| [MySQL] 암호화와 해시 함수 선택 가이드 (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] PASSWORD와 OLD_PASSWORD 함수 완전 해부 (0) | 2025.07.25 |
| [MySQL] 숫자, 날짜, 문자형 자유 변환 꿀팁 모음 (3) | 2025.07.25 |
| [MySQL] 날짜 → 문자열 변환: DATE_FORMAT 응용하기 🗓️ (2) | 2025.07.25 |
| [MySQL] 문자열 → 날짜 변환: STR_TO_DATE 실전 예제 📆 (1) | 2025.07.25 |