การสาธิตการอัปเดตตัวเองที่เขียนด้วยภาษา C ++ รวมตัวโหลด ไคลเอนต์ เซิร์ฟเวอร์ และเครื่องมือการลงนามเพื่อส่งมอบการอัปเดตอัตโนมัติอย่างปลอดภัยสำหรับแอปพลิเคชันเดสก์ท็อป Win32
แอปพลิเคชันเดสก์ท็อป Win32 แบบเนทีฟไม่มีความหรูหราของระบบจัดการแพ็คเกจแบบรวมสำหรับการจัดการการอัปเดตอัตโนมัติ เฟรมเวิร์กนี้แสดงการสาธิตการทำงานของวิธีการส่งมอบและประมวลผลการอัปเดตอย่างปลอดภัยและมีประสิทธิภาพ
ระบบการอัปเดตตัวเองควรเป็นไปตามเป้าหมายด้านความปลอดภัยความสมบูรณ์และความถูกต้อง เฟรมเวิร์กนี้ใช้คีย์ RSA 4096 บิตเพื่อลงนามและตรวจสอบลายเซ็น SHA-256 สำหรับข้อมูลอัปเดต กุญแจสาธารณะจะถูกฝังอยู่ในไบนารี่ของลูกค้าเพื่อตรวจสอบ สมมติว่าการส่งมอบซอฟต์แวร์ครั้งแรกเสร็จสิ้นผ่านแหล่งที่เชื่อถือได้ ผู้ออกที่ถูกต้องสำหรับการอัปเดตเพียงรายเดียวคือผู้ที่สามารถเข้าถึงคีย์ส่วนตัวได้
ข้อมูลอัปเดตจะถูกส่งผ่าน UDP ปัจจัยหลักในการตัดสินใจครั้งนี้คือการลดโอเวอร์เฮดของหน่วยความจำเซิร์ฟเวอร์จากการเชื่อมต่อ TCP (โดยลดภาระของ CPU เป็นโบนัส) โอเวอร์เฮดของหน่วยความจำที่คาดหวังคือประมาณ:
(Update File Size) + (Max Connections) * 80 bytes
ข้อมูลการอัพเดตจะถูกจัดเก็บไว้ในหน่วยความจำโดยตรงเพื่อหลีกเลี่ยงการเข้าถึงดิสก์ ไคลเอนต์และเซิร์ฟเวอร์ตรวจสอบความเป็นเจ้าของ IP โดยการแลกเปลี่ยนโทเค็นการเข้ารหัส 64 บิต การเชื่อมต่อแต่ละครั้งจะได้รับการกำหนดแบนด์วิธเครือข่ายในจำนวนที่จำกัดก่อนที่จะถูกควบคุมปริมาณ ที่อยู่ IP แต่ละรายการจะถูกจำกัดจำนวนการเชื่อมต่อพร้อมกันสูงสุด คุณสมบัติเหล่านี้ช่วยลดการโจมตีเครือข่ายทั่วไปหลายประการ:
การป้องกันการโจมตีแบบแทรกกลางนั้นอาศัยการรับประกันความถูกต้องจากระบบอัปเดต
ไม่จำเป็นต้องมีฟังก์ชันการเข้ารหัสจำนวนมากบนเซิร์ฟเวอร์ (เช่นใน HTTPS) เนื่องจากการรักษาความลับไม่ใช่เป้าหมายด้านความปลอดภัยสำหรับการอัปเดตซอฟต์แวร์ - ข้อมูลการอัปเดตไม่ละเอียดอ่อน
ฝั่งไคลเอ็นต์ไม่มีการพยายามจำกัดความเร็วในการดาวน์โหลด การบูรณาการเข้ากับแอปพลิเคชันของคุณควรพยายามปรับอัตราการส่งแบบไดนามิกโดยอิงตามแพ็กเก็ตที่ลดลงและเวลาแฝงของการเชื่อมต่อ
สถาปัตยกรรมเซิร์ฟเวอร์สาธิตทำงานบนพอร์ตเดียว/เธรดเดียว สามารถรันอินสแตนซ์เซิร์ฟเวอร์หลายตัวต่อเธรดบนพอร์ตที่แตกต่างกันหรือระบบที่แตกต่างกัน (ด้วยการเจรจาที่เกิดขึ้นที่โหลดบาลานเซอร์ที่ไคลเอนต์จะเชื่อมต่อเป็นอันดับแรก (สำหรับการส่งมอบการอัปเดตขนาดใหญ่)
ข้อมูลอัปเดตจะถูกส่งไปเป็นไฟล์เดียวตามที่เป็นอยู่ หากคุณต้องการการสนับสนุนสำหรับการแพตช์ไฟล์ การอัพเดตเดลต้า หรือการบีบอัดหลายไฟล์ คุณควรส่งมอบไฟล์ปฏิบัติการพร้อมยูทิลิตี้และข้อมูลเพื่อจัดการกับคุณสมบัติเหล่านี้ (และแยกออกจากระบบการอัพเดตเอง)
รับประกันความปลอดภัยตราบเท่าที่คีย์ส่วนตัวยังคงปลอดภัย ไม่มีวิธีการเพิกถอนคีย์รวมอยู่ในกรอบงาน (เนื่องจากจะต้องมีการตรวจสอบและความน่าเชื่อถือจากภายนอกจากผู้ให้บริการรายอื่น)
updater.sln
Release
client.dll
เป็น update.dll
signtool.exe
เพื่อสร้าง pub.h
, pub.key
, pri.key
และ update.sig
public_key
ใน client_updater.cpp
ด้วยเนื้อหาจาก pub.h
ที่สร้างขึ้นserver.exe
และ loader.exe
เพื่อสาธิตการอัปเดต