Skip to content

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: 클라이언트 임시키 × 서버 정적 키로 DH
      • s: 클라이언트 정적 공개 키 전송
      • ss: 클라이언트 정적키 × 서버 정적 키로 DH
    • 서버의 응답
      • e: 서버 임시 공개 키 전송
      • ee: 양쪽 임시 키로 DH
      • se: 서버 임시키 × 클라이언트 정적 키로 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 DH

    • es의 역순으로 한쪽의 정적 공개 키와 상대의 임시 공개 키를 사용한다.

활용

  • WireGuard: Noise를 핵심으로 사용하는 VPN 프로토콜
  • WhatsApp: 메시지 암호화에 Noise를 기반으로 한 Signal 프로토콜 사용
  • Slack: 메시지 보안에 암호화 기법 적용
  • Lightning Network: Bitcoin의 라이트닝 네트워크 프로토콜에 사용

참고 자료