C++로 작성된 자체 업데이트 데모입니다. Win32 데스크탑 애플리케이션에 대한 자동 업데이트를 안전하게 제공하기 위한 로더, 클라이언트, 서버 및 서명 도구가 포함되어 있습니다.
기본 Win32 데스크톱 응용 프로그램에는 자동 업데이트를 처리하기 위한 시스템 통합 패키지 관리자가 없습니다. 이 프레임워크는 업데이트를 안전하고 효율적으로 제공하고 처리하는 방법에 대한 작업 시연을 제공합니다.
자체 업데이트 시스템은 무결성 및 신뢰성 보안 목표를 충족해야 합니다. 이 프레임워크는 4096비트 RSA 키를 사용하여 업데이트 데이터에 대한 SHA-256 서명을 서명하고 확인합니다. 공개 키는 확인을 위해 클라이언트 바이너리에 내장되어 있습니다. 소프트웨어의 초기 제공이 신뢰할 수 있는 소스를 통해 수행된다고 가정하면 업데이트에 대한 유효한 발급자는 개인 키에 액세스할 수 있는 발급자뿐입니다.
업데이트 데이터는 UDP를 통해 전송됩니다. 이 결정의 주요 요인은 TCP 연결로 인한 서버 메모리 오버헤드를 줄이는 것이었습니다(보너스로 CPU 로드도 감소했습니다). 예상되는 메모리 오버헤드는 대략 다음과 같습니다.
(Update File Size) + (Max Connections) * 80 bytes
업데이트 데이터는 디스크 액세스를 방지하기 위해 메모리에 직접 저장됩니다. 클라이언트와 서버는 64비트 암호화 토큰을 교환하여 IP 소유권을 확인합니다. 각 연결에는 제한되기 전에 제한된 양의 네트워크 대역폭이 할당됩니다. 각 IP 주소는 최대 동시 연결 수로 제한됩니다. 이러한 기능은 여러 가지 일반적인 네트워크 공격을 완화합니다.
중간자 공격 방지는 업데이트 시스템의 신뢰성 보장에 의존합니다.
기밀성은 소프트웨어 업데이트의 보안 목표가 아니므로 서버에서 무거운 암호화 기능(예: HTTPS)을 실행할 필요가 없습니다. 업데이트 데이터는 중요하지 않습니다.
다운로드 속도를 제한하기 위해 클라이언트 측에서는 어떠한 노력도 하지 않습니다. 애플리케이션에 통합하면 삭제된 패킷과 연결 대기 시간을 기반으로 전송 속도를 동적으로 조정해야 합니다.
데모 서버 아키텍처는 단일 포트/단일 스레드에서 실행됩니다. 여러 서버 인스턴스는 서로 다른 포트 또는 서로 다른 시스템에서 스레드별로 실행될 수 있습니다(대규모 업데이트 전달을 위해 클라이언트가 먼저 연결하는 로드 밸런서에서 협상이 발생함).
업데이트 데이터는 단일 파일에 대해 있는 그대로 전송됩니다. 여러 파일 패치, 델타 업데이트 또는 압축에 대한 지원이 필요한 경우 이러한 기능을 처리하고 업데이트 시스템 자체에서 분리하기 위해 유틸리티 및 데이터가 포함된 실행 파일을 제공해야 합니다.
보안은 개인 키가 안전하게 유지되는 동안에만 유지됩니다. 키 취소 방법은 프레임워크와 함께 번들로 제공되지 않습니다(다른 공급자의 외부 확인 및 신뢰가 필요함).
updater.sln
엽니다.Release
로 변경합니다.client.dll
update.dll
로 복사하고 이름을 바꿉니다.pub.h
, pub.key
, pri.key
및 update.sig
생성하려면 signtool.exe
실행하세요.client_updater.cpp
의 public_key
데이터를 생성된 pub.h
의 콘텐츠로 바꿉니다.server.exe
및 loader.exe
시작하십시오.