用 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
以演示更新。