用 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
signtool.exe
以產生pub.h
、 pub.key
、 pri.key
和update.sig
。client_updater.cpp
中的public_key
資料替換為產生的pub.h
中的內容。server.exe
和loader.exe
以示範更新。