Noise 프로토콜은 간단하고 안전한 암호화 통신을 위해 설계된 현대적인 핸드셰이크 프레임워크이다.
-
Noise protocol framework는 핸드셰이크의 모든 협의를 피함으로써 TLS의 런타임 복잡성을 제거한 대안이다.
- TLS의 복잡한 협상 로직(cipher suite 선택, 프로토콜 버전 협상 등)을 제거하여 구현을 단순화한다.
- 사전에 정의된 패턴을 사용하므로 프로토콜 흐름이 명확하고 예측 가능하다.
-
노이즈를 실행하는 클라이언트와 서버는 분기하지 않는 선형 프로토콜을 따른다.
- TLS는 핸드셰이크 메시지에 포함된 정보에 따라 다양한 경로를 취할 수 있다(조건부 분기).
- Noise는 미리 정의된 패턴을 따르므로 실행 흐름이 선형적이고 단순하다.
- 이는 구현의 정확성을 높이고 보안 검증을 용이하게 한다.
핸드셰이크 패턴
Noise 프로토콜 프레임워크는 다양한 핸드셰이크 패턴을 제공한다.
패턴 이름 규칙
패턴 이름은 다음 형태로 표기된다:
- 첫 글자: 초기자(Initiator, 클라이언트)의 인증 상태
- 둘째 글자: 응답자(Responder, 서버)의 인증 상태
N: 인증 없음(No authentication)K: 사전에 알려진 정적 키(Known static key)I: 즉시 전송되는 정적 키(Immediate static key)P: 예약됨(Pre-shared PSK)
주요 패턴들
NN (No authentication) 패턴
NN: -> e <- e, ee초기자의 첫 번째 메시지 (-> e):
- 클라이언트가 임시 키 쌍을 생성한다.
- 임시 공개 키를 서버로 보낸다.
- 이 메시지는 인증되지 않으므로 Man-in-the-Middle 공격에 취약하다.
응답자의 응답 메시지 (<- e, ee):
- 서버가 자신의 임시 키 쌍을 생성한다.
- 임시 공개 키를 클라이언트에 보낸다.
- 클라이언트의 임시 공개 키와 자신의 임시 공개 키를 사용하여 DH(Diffie-Hellman) 키 교환을 수행한다.
- 결과로 생성된 공유 시크릿으로 이후 통신을 암호화한다.
클라이언트의 처리:
- 서버로부터 받은 임시 공개 키를 사용하여 동일한 DH 키 교환을 수행한다.
- 이후 모든 통신은 암호화된다.
IK (Initiator public key known) 패턴
IK: <- s ... -> e, es, s, ss <- e, ee, se-
사전 조건
- 클라이언트가 서버의 정적 공개 키를 사전에 알고 있어야 한다.
- 서버도 클라이언트의 정적 공개 키를 사전에 알고 있어야 한다.
-
핸드셰이크 흐름
- 클라이언트의 첫 메시지:
e: 임시 공개 키 전송es: 클라이언트 임시키 × 서버 정적 키로 DHs: 클라이언트 정적 공개 키 전송ss: 클라이언트 정적키 × 서버 정적 키로 DH
- 서버의 응답
e: 서버 임시 공개 키 전송ee: 양쪽 임시 키로 DHse: 서버 임시키 × 클라이언트 정적 키로 DH
- 클라이언트의 첫 메시지:
상호 인증이 가능하며, 1-RTT(1 Round Trip)로 통신을 시작할 수 있다.
XX (Mutual authentication) 패턴
XX: -> e <- e, ee, s, es -> s, ss- 양쪽 모두 인증이 필요하지만 사전 설정(pre-shared keys)이 필요 없다.
- 가장 유연한 패턴 중 하나이다.
- 3-RTT 핸드셰이크가 필요하다.
보안
- 상호 인증을 제공하므로 양쪽이 신뢰할 수 있는 상대임을 확인할 수 있다.
- 순방향 보안이 보장된다.
토큰 설명
Noise는 다양한 유형의 핸드셰이크를 지정하기 위해 정의된 토큰의 조합을 사용한다.
기본 토큰
-
e: Ephemeral key (임시 공개 키)- 일회용 임시 키 쌍을 생성하고 공개 키를 전송한다.
- 전향 보안을 제공하는 핵심 요소이다.
-
s: Static key (정적 공개 키)- 장기적으로 사용되는 정적 키 쌍의 공개 키를 전송한다.
- 상호 인증에 사용된다.
DH 토큰
-
ee: ephemeral-to-ephemeral DH- 양쪽의 임시 공개 키를 사용하여 공유 시크릿을 생성한다.
- 세션 키 유도에 사용된다.
-
es: ephemeral-to-static DH- 한쪽의 임시 공개 키와 상대의 정적 공개 키를 사용한다.
- 클라이언트 임시키 × 서버 정적 키: 서버 인증 + 전향 보안 제공
- 서버 임시키 × 클라이언트 정적 키: 클라이언트 인증 + 전향 보안 제공
-
ss: static-to-static DH- 양쪽의 정적 공개 키를 사용한다.
- 장기적인 통신 보안에 사용된다.
- 정적 키가 유출되면 이 DH 결과도 위협받을 수 있다.
-
se: static-to-ephemeral DHes의 역순으로 한쪽의 정적 공개 키와 상대의 임시 공개 키를 사용한다.
활용
- WireGuard: Noise를 핵심으로 사용하는 VPN 프로토콜
- WhatsApp: 메시지 암호화에 Noise를 기반으로 한 Signal 프로토콜 사용
- Slack: 메시지 보안에 암호화 기법 적용
- Lightning Network: Bitcoin의 라이트닝 네트워크 프로토콜에 사용
참고 자료
- https://noiseprotocol.org
- 리얼월드 암호학 - 데이비드 웡