Share via


ChannelManager 클래스의 코드 분석(CNG 예제)

업데이트: 2008년 7월

CNG(Cryptography Next Generation) 보안 통신 예제에서 ChannelManager 클래스는 예제의 IPC(프로세스 간 통신) 인프라를 제공합니다.

이 클래스는 다음과 같은 작업을 담당합니다.

  • 명명된 파이프 만들기, 열기, 닫기 및 삭제

  • 응용 프로그램 제어 플래그, 채널 이름, 디지털 서명, 암호화 키 및 메시지 주고받기

이 항목에 언급된 예제에 대한 개요 및 버전에 대한 설명은 CNG(Cryptography Next Generation) 보안 통신 예제를 참조하십시오.

ChannelManager.cs 파일 내용

ChannelManager.cs 파일에는 다음과 같은 클래스와 메서드가 들어 있습니다.

  • ChannelManager 클래스

    • 생성자: 명명된 파이프를 만든 다음 파이프의 다른 끝점에서 연결을 기다립니다. 명명된 파이프가 파이프 서버이면 WaitForConnection 메서드를 호출하여 클라이언트 연결을 기다립니다. 명명된 파이프가 파이프 클라이언트이면 Connect 메서드를 호출하여 명명된 파이프 서버를 기다립니다. ChannelManager 생성자는 연결될 때까지 반환되지 않습니다.

    • Dispose 메서드: 클래스가 범위를 벗어날 때 인스턴스화된 리소스(Stream m_Stream)를 해제하여 System.IDisposable 인터페이스를 구현합니다.

    • ReadMessage 메서드: 파이프 클라이언트에서 메시지를 받습니다.

    • SendMessage 메서드: 파이프 클라이언트로 메시지를 전송합니다.

  • AppControl 메서드: Alice에서 응용 프로그램 제어 플래그를 Bob 및 Mallory에 전송하는 데 사용됩니다. 이러한 플래그는 세 명령 창 사이에서 Version,fMallory 및 fVerbose 상태를 동기화합니다. 암호화 또는 메시지 전송에는 AppControl이 관련되지 않습니다. 이는 전적으로 내부 응용 프로그램 제어 메커니즘입니다. 이 메서드는 사용 후 삭제되는 임시 ChannelManager 개체를 만듭니다.

  • SendChannelName 메서드: 편의를 위해 제공되는 메서드로서 클라이언트에 새 채널 이름을 전송합니다. 이 메서드는 사용 후 삭제되는 임시 ChannelManager 개체를 만듭니다.

  • ReceiveChannelName 메서드: 편의를 위해 제공되는 메서드로서 서버에서 새 채널 이름을 수신합니다. 이 메서드는 사용 후 삭제되는 임시 ChannelManager 개체를 만듭니다.

ChannelManager 클래스 세부 사항

Alice, Bob 및 Mallory 응용 프로그램은 ChannelManager 인스턴스에서 만드는 명명된 파이프로 연결됩니다. 각 응용 프로그램은 두 가지 형식의 ChannelManager 개체를 만들고 삭제합니다.

  • 장기 개체: Alice 및 Bob은 모두 Run 메서드가 시작될 때 장기 ChannelManager 개체를 만들고 이 개체를 사용하여 판매 고객 정보를 전송합니다. Mallory는 자신의 Run 메서드에서 두 개의 장기 ChannelManager 개체를 만듭니다. 하나는 Alice와 통신할 때, 다른 하나는 Bob과 통신할 때 사용됩니다. 채널은 암호화 키와 암호화된 메시지를 교환하는 데 사용되며 Run 메서드가 끝날 때까지 유지된 후 삭제됩니다.

  • 임시 개체: AppControl, SendChannelName 및 ReceiveChannelName 메서드는 특정 작업을 수행하는 임시 ChannelManager 개체를 만듭니다. 작업이 끝나면 개체가 삭제됩니다. 또한 버전 4와 5에서 Alice는 임시 ChannelManager 개체를 사용하여 Bob에게 개인 디지털 서명 키를 전송합니다.

ChannelManager 클래스는 System.IDisposable 인터페이스를 구현하고 send 및 receive 전송 모드를 모두 관리합니다.

이 클래스는 Alice, Bob 및 Mallory 간에 메시지가 동적으로 교환된다는 인상을 줍니다. 그러나 실제로 파이프는 한 번에 한 가지 모드(서버 또는 클라이언트)로만 사용되므로 Alice, Bob 및 Mallory 응용 프로그램은 선형 방식으로 주의깊게 실행됩니다. 각 응용 프로그램은 예제가 실행되는 도중 특정 시점에 파이프가 열리거나 닫힐 것으로 예상합니다. 통신은 비동기 방식으로 보이지만 실제로는 그렇지 않습니다.

스레드 관리자가 백그라운드에서 스레드를 관리하는 것처럼 보일 수 있지만 스레드 관련 호출은 사용되지 않습니다. Alice, Bob 및 Mallory 간에 send와 receive 호출을 주의깊게 구성하는 방법으로만 프로세스 간 타이밍이 구현되고 있습니다. 따라서 세 창이 CNG 예제 개요에 설명된 시나리오에 따라 서로 매끄럽게 통신하는 것처럼 보입니다.

이러한 구현 방법에는 동기화라는 장점이 있으며 코드가 단순하고 간결하지만 견고함이 부족하다는 단점이 있습니다. 파이프 클라이언트가 서버에 연결하지 못하면 서버가 응답을 중지합니다. 이러한 오류를 매끄럽게 처리하는 다중 스레드 파이프 서버를 사용하는 방법이 더 좋습니다. 그러나 이 방법은 지나치게 복잡하므로 이 예제에서 사용하지 않습니다.

ChannelManager 클래스는 Alice, Bob 및 Mallory의 Main 메서드와 Communicator.cs 파일의 Communicator 클래스 생성자에서 인스턴스화됩니다.

자세한 용도

ChannelManager 클래스는 응용 프로그램 제어, 채널 이름 전송, 메시지 전송, 디지털 서명 키 전송 및 공개 암호화 키 전송이라는 서로 다른 다섯 가지 상황에서 사용됩니다. 다음 목록에서는 이러한 용도를 소스 코드에 나타나는 순서대로 보여 줍니다.

  1. 응용 프로그램 제어: Alice는 Main 메서드가 시작될 때 InitializeOptions 메서드를 호출하고 사용자로부터 세션 옵션을 입력받습니다. 그런 다음 AppControl 메서드를 사용하여 이러한 옵션(Version,fMallory 및 fVerbose))을 Bob 및 Mallory에 전송합니다. 사용자가 응용 프로그램을 종료하기 위해 "x"를 입력하면 AppControl 메서드에서 Bob 및 Mallory에 세션 옵션 대신 "exit"라는 문자열을 전송합니다.

    • Alice의 AppControl 메서드는 BobControlChannel 및 MalloryControlChannel이라는 두 개의 임시 ChannelManager 파이프 서버를 만듭니다.

    • Bob 및 Mallory의 AppControl 메서드는 임시 ChannelManager 파이프 클라이언트를 만들고 자신의 제어 채널에 연결합니다.

    • Bob 및 Mallory는 Alice가 보내는 세션 옵션을 받고 임시 ChannelManager 개체를 즉시 삭제합니다.

  2. 채널 이름 전송: 세션 옵션을 전송한 후 Alice는 Bob에게 새 채널 이름을 전송합니다.

    • Alice는 SendChannelName 메서드를 사용하고 Bob 및 Mallory는 ReceiveChannelName 메서드를 사용합니다. 각 메서드는 임시 ChannelManager 파이프 서버 또는 클라이언트를 만듭니다. 새 채널 이름이 전송되거나 수신된 후 임시 ChannelManager 인스턴스가 삭제됩니다.

    • Mallory가 Bob보다 200밀리초 먼저 ReceiveChannelName을 호출하여 새 채널 이름을 가로채므로 보안 결함이 발생합니다. 이 보안 결함에 대한 자세한 내용은 중간자 개입 공격 구현(CNG 예제)을 참조하십시오.

  3. 메시지 전송: 세션 옵션과 새 채널 이름이 전송된 후 Alice, Bob 및 Mallory는 Communicator 개체를 만듭니다. Communicator 생성자는 이전 단계에서 전송된 새 채널의 이름을 받아 장기 ChannelManager 인스턴스를 만드는 데 사용합니다. 이 개체는 임시가 아닌 유일한 ChannelManager 인스턴스입니다. 이 개체는 마지막 메시지가 전송 및 수신될 때까지 유지된 후 삭제됩니다.

    참고:

    Alice가 만드는 ChannelManager 개체는 AliceAndBobChannel이라는 파이프 서버를 캡슐화합니다. 그러나 Mallory는 이 이름을 가로채서 Bob에게 다른 채널 이름(AliceAndBobChannel1)을 전송합니다. Bob은 이 문자열을 Communicator 생성자에 name 매개 변수로 전달하여 AliceAndBobChannel1이라는 파이프 클라이언트를 만듭니다. 이러한 이름 변경을 통해 Mallory는 Bob에게 보내는 메시지에서 자신을 Alice로 가장할 수 있습니다.

  4. 디지털 서명 키 전송: Alice는 Communicator 개체를 만든 후 Version 플래그를 조사합니다. 버전 3에서는 PublicChannel 명명된 파이프를 통해 Bob에게 디지털 서명 키를 전송하며, Mallory가 이를 가로챕니다. 버전 4 및 5에서는 임시 비밀 ChannelManager 인스턴스를 만듭니다. 그런 다음 이 인스턴스를 사용하여 Bob에게 개인 디지털 서명 키를 전송합니다.

    참고:

    Mallory는 IM(인스턴트 메시징) 소프트웨어의 버전 4 또는 5를 제공받지 않았으므로 이 명명된 개인 파이프에 대해 알 수 없습니다. Alice는 3단계에서 만든 장기 메시징 ChannelManager 개체를 계속 사용하여 Bob에게 가짜 디지털 서명을 전송합니다. 버전 4 및 5에서 Bob의 IM 도구는 이 개체를 무시하도록 업데이트되었습니다. 그러나 Mallory는 서명이 유효하다고 생각하고 이 서명을 사용하여 암호화 키와 메시지에 서명합니다. 이로 인해 범죄가 발각됩니다.

  5. 공개 암호화 키 전송: Version 플래그가 다시 검사됩니다. 버전 2 이상에서는 3단계에서 만든 장기 메시징 ChannelManager 개체를 사용하여 공개 암호화 키를 주고받습니다.

채널 이름, 디지털 서명 및 암호화 키가 교환된 후 Alice와 Bob은 3단계에서 만든 ChannelManager를 사용하여 메시지를 전송합니다.

참고 항목

개념

CNG(Cryptography Next Generation) 보안 통신 예제

ChannelManager.cs 소스 코드(CNG 예제)

소스 코드 개요(CNG 예제)

참조

NamedPipeServerStream

NamedPipeClientStream

변경 기록

날짜

변경 내용

이유

2008년 7월

항목이 추가되었습니다.

향상된 기능 관련 정보