핵심 인사이트 (3줄 요약)
- 본질: CHAP (Challenge Handshake Authentication Protocol)는 PPP 인증 과정에서 비밀번호를 평문으로 전송하지 않고(No Cleartext), 질의-응답(Challenge-Response) 방식과 일방향 해시(Hash) 함수를 결합하여 보안을 강화한 3-Way 인증 프로토콜이다.
- 보안성: 서버가 무작위 난수(Challenge)를 보내면, 클라이언트는 이 난수와 자신의 비밀번호를 섞어 해시값(Response)을 만든 뒤 서버에 전송한다. 해시값은 복호화가 불가능하므로 스니핑이나 재생 공격(Replay Attack)을 원천 차단한다.
- 지속성: PAP와 달리 연결 초기뿐만 아니라 연결 유지 중에도 서버가 불시에(랜덤하게) 재인증을 요구(Repeated Challenge)하여 통신 도중 세션을 가로채는 하이재킹(Hijacking)을 방어한다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: CHAP (Challenge Handshake Authentication Protocol, RFC 1994)는 PAP의 치명적인 평문 전송 취약점을 극복하기 위해 설계된 보안 인증 프로토콜이다. 클라이언트와 서버가 사전에 공유된 비밀번호(Shared Secret)를 가지고 있다는 전제하에, 비밀번호 자체를 넘기지 않고 "나는 비밀번호를 알고 있다"는 사실만 해시 연산을 통해 증명(Zero-Knowledge Proof의 일종)한다.
-
필요성: 해커가 패킷을 가로채서(Sniffing) 비밀번호를 알아내거나, 탈취한 패킷을 다시 보내어(Replay Attack) 정상 사용자로 위장하는 공격이 빈번해지자, 비밀번호 자체가 네트워크 선로를 타지 않게 만드는 근본적인 해결책이 필요해졌다.
-
💡 비유: 스파이 영화의 "암구호"와 같습니다. 문지기(서버)가 매일 바뀌는 질문(Challenge, 예: "오늘 점심은?")을 던지면, 스파이(클라이언트)는 머릿속에 있는 비밀번호(예: "사과")를 조합하여 정해진 규칙(해시)에 따라 암호화된 대답("사과가 들어간 샐러드")을 합니다. 해커가 대답을 엿듣고 다음 날 "사과가 들어간 샐러드"라고 말해도, 그날의 질문(Challenge)이 달라서 틀린 대답이 되므로 쫓겨나게 됩니다.
📢 섹션 요약 비유: CHAP 인증은 비밀번호를 그대로 말하지 않고, 매번 바뀌는 **"1회용 난수 퍼즐 조각"**에 비밀번호를 끼워 맞춘 결과물(해시)만 검사관에게 보여주어 정답을 확인받는 고도의 보안 검문소입니다.
Ⅱ. CHAP의 동작 원리와 3-Way 핸드셰이크 (Deep Dive)
1. 3-Way 핸드셰이크 메커니즘
CHAP는 인증 과정을 서버(Authenticator)가 주도(Server-driven)한다.
- Challenge (질의): 서버가 클라이언트에게 임의의 무작위 값(Nonce, Challenge)과 세션 ID를 전송한다.
- Response (응답): 클라이언트는 받은 난수, 세션 ID, 그리고 자신이 알고 있는 '비밀번호'를 MD5(Message-Digest algorithm 5) 같은 해시 함수에 넣고 돌려 **해시값(Response)**을 생성해 서버로 보낸다. (이때 비밀번호는 전송되지 않음)
- Success / Failure (결과): 서버도 자신이 보낸 난수와 DB에 저장된 클라이언트의 비밀번호를 똑같이 해시 함수에 넣어 결과값을 계산한다. 서버가 계산한 값과 클라이언트가 보낸 응답값(Response)이 정확히 일치하면 승인(Success)한다.
┌─────────────────────────────────────────────────────────────┐
│ CHAP 동작 방식 (3-Way) │
├─────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트 (Peer)] [서버 (Authenticator)]│
│ (PW = "sec123") (DB: PW = "sec123")│
│ │ │ │
│ │ 1. Challenge (난수값 X 전송) │ │
│ │◀────────────────────────────────────────┤ │
│ │ │ │
│ MD5(X + "sec123") │ │
│ = 해시값 Y 도출 2. Response (해시값 Y 전송) │ │
│ ├────────────────────────────────────────▶│ 서버도 자체적으로 │
│ │ │ MD5(X + "sec123") │
│ │ │ = 해시값 Y' 계산 │
│ │ │ │
│ │ 3. Success/Failure (Y == Y' 비교) │ │
│ │◀────────────────────────────────────────┤ │
│ │
└─────────────────────────────────────────────────────────────┘
2. 해시 함수의 일방향성(One-way)과 재생 공격 방어
- 스니핑 방어: 네트워크로 전송되는 값은 난수 X와 해시값 Y뿐이다. 해시 함수는 일방향 함수이므로 해커가 Y를 가로채도 원래의 비밀번호("sec123")를 역산하여 알아낼 수 없다.
- 재생 공격(Replay Attack) 방어: 서버는 인증 시도마다 매번 다른 난수 X(Challenge)를 생성한다. 해커가 어제 캡처한 해시 응답값 Y를 오늘 다시 서버에 전송해 봐야, 오늘 서버가 요구한 난수 Z에 대한 정답(해시값 W)과는 일치하지 않으므로 즉시 차단된다.
- 주기적 재인증: 통신 중에도 서버가 랜덤한 주기로 다시 Challenge를 보내 재인증을 요구하여 세션 하이재킹을 방어한다.
📢 섹션 요약 비유: CHAP는 **"수학적 믹서기(해시)"**입니다. 과일(난수)과 설탕(비밀번호)을 넣고 갈아버린 주스(응답)만 전송하므로, 해커가 주스를 훔쳐 가도 원래 설탕의 결정 모양(비밀번호 문자열)을 절대 복원할 수 없습니다.