테마
02. 해시 알고리즘과 패스워드 보안
학습 목표
- MD5와 SHA 계열 해시 알고리즘의 차이를 설명할 수 있다.
- 왜 패스워드를 평문으로 저장하면 안 되는지 이해한다.
- 패스워드를 해시로 저장하는 방식의 원리를 설명할 수 있다.
- Brute Force 공격이 무엇이고, Salt가 왜 필요한지 이해한다.
- MD5로 패스워드를 해싱하면 안 되는 이유를 설명할 수 있다.
전체 구조
1. 대표 해시 알고리즘
MD 계열과 SHA 계열
해시 알고리즘은 크게 MD 계열과 SHA 계열로 나뉜다.
| 알고리즘 | 출력 길이 | 경우의 수 | 보안성 | 패스워드 사용 |
|---|---|---|---|---|
| MD5 | 128비트 | 2^128 | 낮음 | 사용 금지 |
| SHA-1 | 160비트 | 2^160 | 낮음 | 비권장 |
| SHA-256 | 256비트 | 2^256 | 높음 | 권장 |
| SHA-512 | 512비트 | 2^512 | 매우 높음 | 권장 |
왜 출력 길이가 중요한가?
출력 길이가 길다 = 경우의 수가 많다 = 같은 결과를 내는 다른 입력을 찾기 어렵다
- MD5 (128비트): 경우의 수 약 3.4 x 10^38
- SHA-256 (256비트): 경우의 수 약 1.2 x 10^77
SHA-256의 경우의 수는 MD5의 경우의 수를 제곱한 것보다 크다.
해시 결과 예시
"test string"이라는 문자열을 해시하면:
MD5: 661f8009fa8e56a9d0e94a0a644397d7
SHA-256: d5579c46dfcc7f18207013e65b44e4cb4e2c2298f4ac457ba8f82743f31e930b입력이 짧든 길든 결과 길이는 항상 동일하다. 이것이 고정 길이 출력 특성이다.
암기 포인트: 숫자가 클수록 → 경우의 수 넓음 → 충돌 가능성 낮음 → 보안성 높음
2. 패스워드 저장의 원칙
절대로 평문 저장 금지
사용자가 회원가입할 때 입력한 패스워드를 그대로 DB에 저장하면 절대 안 된다.
평문 저장의 위험:
- 내부자 위협: DB 관리자가 패스워드를 볼 수 있다
- 해킹 위협: DB가 유출되면 모든 패스워드가 노출된다
- 2차 피해: 사용자는 여러 사이트에 같은 패스워드를 쓰는 경우가 많다
해시로 패스워드 저장하기
패스워드는 반드시 단방향 해시로 변환해서 저장해야 한다.
핵심 포인트:
- 서버는 원본 패스워드를 저장하지 않는다
- 서버는 해시 결과만 가지고 있다
- 로그인할 때 입력된 패스워드를 같은 방법으로 해시해서 결과만 비교한다
3. 사용자 인증 방식의 종류
패스워드는 인증 방식 중 지식 기반 인증에 해당한다.
| 인증 방식 | 예시 | 장점 | 단점 |
|---|---|---|---|
| 소지 기반 | 열쇠, OTP | 물리적 소유 필요 | 분실/도난 위험 |
| 지식 기반 | 패스워드 | 구현 간편, 비용 낮음 | 유출/유추 위험 |
| 생체 기반 | 지문 | 복제 어려움 | 변경 불가, 오인식 |
| 위치 기반 | GPS | 추가 인증 요소 | 위치 변경 시 불편 |
실무에서는 이들을 **조합(Multi-Factor)**해서 사용한다. 예: 패스워드(지식) + OTP(소지)
4. Brute Force 공격과 MD5의 문제
Brute Force(전수 조사) 공격이란?
해시는 역계산이 불가능하다. 그런데 해커는 다른 방법으로 공격한다.
이것이 Brute Force(전수 조사) 공격이다. 원본을 역계산하는 게 아니라, 가능한 모든 입력을 시도해서 같은 해시 결과가 나오는 것을 찾는 것이다.
왜 MD5가 위험한가?
MD5의 출력 길이는 128비트로 경우의 수가 너무 적다. 현대 컴퓨터로 6자리 패스워드를 전수 조사하면 몇 시간 안에 뚫린다.
암기 포인트: MD5는 패스워드 해싱에 절대 사용 금지. SHA-256 이상을 사용하라.
5. Salt(솔트)란?
Salt의 필요성
SHA-256을 써도 패스워드가 짧으면 Brute Force에 취약할 수 있다. 예를 들어 패스워드가 "1234"라면 금방 찾아낸다.
이 문제를 해결하는 것이 Salt다.
Salt의 원리
Salt는 패스워드에 시스템만 아는 추가 문자열을 붙여서 해시하는 것이다.
Salt의 효과
| 항목 | Salt 없이 | Salt 적용 |
|---|---|---|
| 패스워드 | "1234" | "xK9mQ_server_1234" |
| 해시 대상 길이 | 4자 | 18자 |
| Brute Force 난이도 | 매우 쉬움 | 매우 어려움 |
| 해커의 전수조사 | 4자리만 시도 | Salt까지 맞춰야 함 |
Salt의 비유: 음식의 소금
Salt라는 이름은 음식에 소금을 넣는 것에서 유래했다.
Salt의 특성
- Salt는 시스템 내부자(개발자)만 알고 있는 값이다
- 암호 키처럼 강력한 보안이 아닌, 추가적인 보호막 역할이다
- Salt는 패스워드 앞, 뒤, 또는 양쪽 어디에든 붙일 수 있다
- Salt가 유출되어도, Brute Force의 경우의 수는 여전히 크게 늘어난다
6. 전체 패스워드 보안 흐름
핵심 암기 포인트
해시 알고리즘: MD 계열, SHA 계열이 대표적. 출력 길이가 길수록 보안성 높음.
MD5 금지: 128비트로 경우의 수 적음. 패스워드 해싱에 절대 사용 금지.
SHA-256 권장: 현재(2022 기준) 패스워드 해싱의 사실상 표준.
패스워드 저장 원칙: 평문 저장 금지 → 반드시 단방향 해시 → DB에는 해시값만 저장.
Brute Force: 역계산이 아닌 전수 조사 공격. 가능한 모든 입력을 시도.
Salt: 패스워드에 시스템만 아는 문자열을 추가하여 경우의 수를 확대. 소금 비유.
확인 질문
- MD5를 패스워드 해싱에 사용하면 안 되는 이유는 무엇인가?
- SHA-256의 "256"은 무엇을 의미하며, 왜 숫자가 클수록 좋은가?
- 패스워드를 해시로 저장했을 때, 로그인 시 어떻게 패스워드를 검증하는가?
- Brute Force 공격은 해시의 역계산인가? 아니라면 어떤 방식인가?
- Salt를 적용하면 왜 Brute Force 공격이 어려워지는가?