ฉันจะป้องกันเกมของฉันด้วยรหัสซีดี / หมายเลขซีเรียลได้อย่างไร


25

ดังนั้นฉันตัดสินใจแล้วว่าฉันต้องการเก็บสำเนาเกม XNA ของฉันที่ละเมิดลิขสิทธิ์ไม่ให้เข้าถึงเซิร์ฟเวอร์เกมอย่างเป็นทางการ (ซึ่งมีการควบคุมดังนั้นผู้ที่ชำระเงินสำหรับเกมจะได้รับประสบการณ์ที่ดีที่สุด) โดยตัดการเชื่อมต่อลูกค้าด้วยแผ่นซีดีที่ผิด คีย์ (หรือหมายเลขซีเรียลเนื่องจากเกมเป็นดิจิตอลและไม่มีซีดีใด ๆ )

ฉันจะนำระบบป้องกันหมายเลขซีเรียลนั้นเข้าสู่เกมของฉันได้อย่างไร (ทั้งไคลเอนต์และเซิร์ฟเวอร์การตรวจสอบความถูกต้องหลัก) ดังนั้นจึงไม่สามารถแฮ็คได้อย่างง่ายดาย


โปรดทราบว่าฉันไม่มีประสบการณ์ในการป้องกันซอฟต์แวร์ประเภทนั้น

ฉันไม่เคยทำแบบนี้มาก่อน แต่ฉันเข้าใจพื้นฐาน ฉันเห็นว่าทำไมฉันไม่สามารถตรวจสอบคีย์บนไคลเอนต์ได้ดังนั้นจึงเป็นเรื่องดีที่ฉันจะใช้การรับรองความถูกต้องเข้าสู่ระบบ / ผ่านด้วยการป้อนคีย์ครั้งเดียว

ปัจจุบันเป้าหมายของการป้องกันนี้คือการป้องกันผู้โกงที่อาจเกิดขึ้นและประพฤติตัวไม่เหมาะสมออกจากเซิร์ฟเวอร์อย่างเป็นทางการ ทุกคนสามารถเล่นบนเซิร์ฟเวอร์ส่วนตัวที่มีหรือไม่มีคีย์ แต่โอกาสที่พวกเขาจะได้รับประสบการณ์ที่ไม่พึงประสงค์จากผู้เล่นคนอื่นนั้นยิ่งใหญ่กว่า ฉันเดาว่ามันง่ายพอที่จะซื้อผู้เล่นเนื่องจากพวกเขาต้องออนไลน์เพื่อเล่นบนเซิร์ฟเวอร์อย่างเป็นทางการ

เนื่องจากการแฮ็คไคลเอนต์นั้นง่ายเกินไปฉันจะปกป้องเฉพาะขั้นตอนการลงทะเบียนเริ่มต้น (และอาจเป็นการรับรองความถูกต้องฝั่งเซิร์ฟเวอร์) ดังนั้นจึงไม่มีใครสามารถขโมยคีย์ได้ในขณะที่กำลังถ่ายโอน


ดูสิ่งนี้ด้วย:

เกมแบบผู้เล่นหลายคนควรจัดการกับการรับรองความถูกต้องอย่างไร


หากใครบางคนลงคะแนนฉันคาดหวังอย่างน้อยความคิดเห็นเกี่ยวกับสิ่งที่ผิดกับคำถาม พวกจริง ๆ แล้วฉันต้องการให้คำถามของฉันดีและช่วยเหลือผู้คนมากกว่าฉัน
user1306322

4
ฉันเดาว่ามันเป็นปฏิกิริยาอัตโนมัติในการเพิ่ม DRM ประเภทนี้ไม่เลวโดยเฉพาะ แต่พวกเราหลายคนมีประสบการณ์ที่ไม่ดีเช่น - เมื่อ Spore ทำให้ Windows ของฉันติดตั้ง
Izkata

แทนที่จะเป็นคีย์ CD คุณคิดว่าวิธี MMO-like / Minecraft-like ต้องการชื่อผู้ใช้ / รหัสผ่านเพื่อเข้าสู่ระบบและใช้สิ่งนั้นเพื่อรับรองความถูกต้องของผู้ใช้หรือไม่?
Tetrad

4
ต้องการ DRM ในแอพ. NET! สิ่งนี้จะล้มเหลวในที่สุดด้วยเครื่องมืออย่าง Reflector ลองดูที่ Terraria การพัฒนาหยุดลงเนื่องจากการละเมิดลิขสิทธิ์ (และรายได้จำนวนมาก ... ) ฉันชอบแนวคิดการตรวจสอบความถูกต้องของ @ Tetrad เนื่องจากป้องกันไม่ให้ผู้คนต้องแก้ไขฟังก์ชั่นการตรวจสอบความถูกต้อง เก็บข้อมูลทั้งหมดบนเซิร์ฟเวอร์ของคุณและเมื่อล็อกอินสำเร็จให้ป้อนข้อมูลของพวกเขา หากคุณเก็บข้อมูลไว้ในเครื่องพวกเขาก็สามารถแก้ไขฟังก์ชั่นการตรวจสอบความถูกต้องได้

2
@Anko ที่ได้รับการอ้างอิงถึงคำพูดที่มีชื่อเสียง"เราจำเป็นต้องมีแร่ธาตุอื่น ๆ อีกมากมาย" และฉันหมายถึงข้อเท็จจริงและความเชี่ยวชาญ บางทีอาจมีรายละเอียด ฉันไม่ทราบว่าเมื่อปัญหาสำคัญมีความสนใจพอเพียงแค่รู้สึกว่ามีบางสิ่งเพิ่มและผู้เข้าชมไซต์อาจพบว่าหัวข้อนี้น่าสนใจ (และอาจกลายเป็นผู้ใช้ใหม่) ดังนั้นฉันจึงเพิ่มค่าตอบแทน
user1306322

คำตอบ:


24

โดยทั่วไปคุณมีข้อกำหนดสามประการ:

  1. ไม่ควรใช้คีย์เดียวกันสำหรับหลาย ๆ อินสแตนซ์ของลูกค้า
  2. ไม่ควรสร้างคีย์ที่ถูกต้องใหม่และ
  3. ไม่ควรขโมยกุญแจของลูกค้าที่ชอบด้วยกฎหมาย

ส่วนแรกควรตรงไปตรงมา: อย่าให้ผู้เล่นสองคนลงชื่อเข้าใช้เซิร์ฟเวอร์เดียวกันด้วยรหัสเดียวกันในเวลาเดียวกัน นอกจากนี้คุณยังสามารถให้เซิร์ฟเวอร์แลกเปลี่ยนข้อมูลเกี่ยวกับผู้ใช้ที่เข้าสู่ระบบหรือติดต่อเซิร์ฟเวอร์ authetication ที่ใช้ร่วมกันเพื่อให้แม้ใช้คีย์เดียวกันสำหรับผู้เล่นที่แตกต่างกันบนเซิร์ฟเวอร์ที่แตกต่างกันในเวลาเดียวกันจะล้มเหลว คุณอาจต้องการค้นหารูปแบบที่น่าสงสัยในการใช้คีย์และหากคุณพิจารณาว่าคีย์รั่วไหลให้เพิ่มเข้าไปในรายการคีย์ที่ถูกห้าม


สำหรับส่วนที่สองวิธีหนึ่งคือการรักษาฐานข้อมูลของคีย์ที่ออกให้ที่ถูกต้องทั้งหมด ตราบใดที่คีย์นั้นมีความยาวเพียงพอ (เช่น 128 บิตขึ้นไป) และเลือกแบบสุ่ม (โดยใช้ RNG ที่ปลอดภัย) โอกาสของทุกคนที่จัดการเพื่อเดาคีย์ที่ถูกต้องนั้นเป็นศูนย์ (แม้แต่ปุ่มที่สั้นกว่าก็ยังสามารถปลอดภัยได้หากคุณใช้การ จำกัด อัตราการพยายามล็อกอินล้มเหลวเพื่อหยุดความพยายามในการค้นหาคีย์ที่ถูกต้องโดยใช้กำลังดุร้าย)

หรือคุณสามารถสร้างคีย์ได้โดยใช้ตัวระบุที่ไม่ซ้ำกันและเพิ่มรหัสการตรวจสอบข้อความ (เช่นHMAC ) ซึ่งคำนวณโดยใช้รหัสลับหลักลงไป อีกครั้งตราบใดที่ MAC นั้นยาวพออัตราต่อรองของใครก็ตามที่ไม่ทราบว่ามาสเตอร์คีย์นั้นสามารถเดา MAC ที่ถูกต้องสำหรับ ID ใด ๆ นั้นจะไม่มีความสำคัญ ข้อดีอย่างหนึ่งของวิธีนี้นอกเหนือจากการลบความต้องการฐานข้อมูลคีย์คือตัวระบุสามารถเป็นสตริงที่ไม่ซ้ำกันและสามารถเข้ารหัสข้อมูลเกี่ยวกับไคลเอนต์ที่คีย์ออก

ปัญหาอย่างหนึ่งของการใช้ MAC คือเซิร์ฟเวอร์เกมอย่างเป็นทางการ (หรืออย่างน้อยเซิร์ฟเวอร์การตรวจสอบความถูกต้อง) จำเป็นต้องรู้รหัสหลักเพื่อตรวจสอบ MAC ซึ่งหมายความว่าหากเซิร์ฟเวอร์ถูกแฮ็กคีย์หลักอาจถูกรั่วไหล วิธีหนึ่งในการลดความเสี่ยงนี้คือการคำนวณ MACs จำนวนมากสำหรับแต่ละ ID โดยใช้คีย์หลักที่แตกต่างกัน แต่เก็บเฉพาะหนึ่งคีย์หลักบนเซิร์ฟเวอร์เกม ด้วยวิธีนี้หากคีย์หลักนั้นรั่วไหลและใช้สร้างรหัสปลอมคุณสามารถเพิกถอนและเปลี่ยนเป็นคีย์หลักอื่นได้ หรือคุณสามารถแทนที่ MAC ด้วยลายเซ็นดิจิทัลซึ่งสามารถตรวจสอบได้โดยใช้เพียงครึ่งสาธารณะของคีย์หลัก


สำหรับส่วนที่สามวิธีหนึ่งคือตรวจสอบให้แน่ใจว่าลูกค้าจะไม่ส่งกุญแจไปให้ใครโดยไม่ตรวจสอบว่าผู้รับเป็นเซิร์ฟเวอร์ที่เป็นทางการที่ถูกกฎหมายจริงๆ ตัวอย่างเช่นคุณสามารถใช้SSL / TLS (หรือDTLS ) สำหรับกระบวนการเข้าสู่ระบบออกใบรับรองที่กำหนดเองสำหรับเซิร์ฟเวอร์เกมของคุณและมีใบรับรองความน่าเชื่อถือของลูกค้าที่ออกโดยคุณเท่านั้น สะดวกในการใช้ TLS จะช่วยปกป้องคีย์ไคลเอ็นต์ (และข้อมูลการตรวจสอบความถูกต้องอื่น ๆ ) จากผู้ดักฟังเช่นบน WLAN สาธารณะ

น่าเสียดายที่วิธีการนี้จะไม่อนุญาตให้เซิร์ฟเวอร์บุคคลที่สามยืนยันรหัสลูกค้าแม้ว่าพวกเขาต้องการ คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยการตั้งค่าเซิร์ฟเวอร์รับรองความถูกต้องอย่างเป็นทางการที่เซิร์ฟเวอร์เกมของบุคคลที่สามสามารถใช้งานได้เช่นโดยให้ลูกค้าลงชื่อเข้าใช้เซิร์ฟเวอร์การตรวจสอบความถูกต้องและรับโทเค็นครั้งเดียวแบบสุ่ม เซิร์ฟเวอร์เกม (ซึ่งจะส่งโทเค็นไปยังเซิร์ฟเวอร์การตรวจสอบความถูกต้องเพื่อตรวจสอบ)

อีกวิธีหนึ่งคือคุณสามารถออกใบรับรองลูกค้าจริงหรืออะไรทำนองนั้นกับลูกค้าของคุณ คุณสามารถใช้โปรโตคอลที่มีอยู่ (เช่น TLS) ที่รองรับการตรวจสอบรับรองลูกค้า (แนะนำ) หรือใช้งานของคุณเองเช่นนี้:

  • ใบรับรองไคลเอ็นต์ประกอบด้วยสตริง ID โดยพลการคู่คีย์สาธารณะ / ส่วนตัวและลายเซ็นดิจิทัลของ ID และคีย์สาธารณะโดยใช้คีย์หลัก
  • ในการเข้าสู่ระบบลูกค้าจะส่งรหัสประชาชนกุญแจและลายเซ็นของพวกเขา เซิร์ฟเวอร์ตอบกลับด้วยสตริงการท้าทายที่ไม่ซ้ำกัน (โดยเฉพาะอย่างยิ่งรวมถึง ID เซิร์ฟเวอร์และการประทับเวลาที่ลูกค้าควรตรวจสอบ) ซึ่งลูกค้าลงนามด้วยรหัสส่วนตัว (เพื่อพิสูจน์ว่าพวกเขารู้ว่ากุญแจ) และส่งลายเซ็นไปยังเซิร์ฟเวอร์
  • เซิร์ฟเวอร์ตรวจสอบทั้งลายเซ็นเพื่อพิสูจน์ว่า ID + พับลิคคีย์เป็นรหัสไคลเอนต์ที่ถูกต้อง (ตั้งแต่พวกเขาเซ็นชื่อด้วยมาสเตอร์คีย์) และคีย์ไคลเอ็นต์นั้นเป็นของลูกค้าจริง ๆ (เนื่องจากไคลเอนต์สามารถเซ็นชื สำคัญ).

(โปรโตคอลนี้สามารถทำให้ง่ายขึ้นอีกโดยให้ไคลเอนต์สร้าง "ความท้าทาย" ประกอบด้วย ID เซิร์ฟเวอร์และการประทับเวลาและลงนามแน่นอนแล้วเซิร์ฟเวอร์ต้องตรวจสอบว่า ID และการประทับเวลานั้นถูกต้องแล้วโปรดทราบด้วยว่า โปรโตคอลอย่างง่ายนี้จะไม่หยุดผู้โจมตีคนกลางที่จะสามารถขโมยเซสชันของไคลเอ็นต์แม้ว่าจะป้องกันไม่ให้พวกเขาได้รับรหัสส่วนตัวของลูกค้าที่จำเป็นสำหรับการเข้าสู่ระบบในอนาคต)


2
จุดเล็ก ๆ จุดหนึ่ง - ในขณะที่ปุ่มสุ่มทั้งหมดให้พื้นที่สำคัญสูงสุด (และสามารถใช้งานได้อย่างสมบูรณ์แบบหากคุณตรวจสอบความถูกต้องกับฐานข้อมูลของคีย์ที่ออกให้) มันไม่เป็นมิตรกับผู้ใช้ ใส่การตรวจสอบความถูกต้องลงในคีย์เพื่อให้ Mistypes ส่วนใหญ่ถูกดักจับก่อนที่คุณจะพยายามโจมตีเซิร์ฟเวอร์
Loren Pechtel

ฉันคิดว่า @ LorenPechtel มีจุดแข็งอยู่ที่นั่นเกี่ยวกับความเป็นมิตรกับผู้ใช้ของคีย์และผู้ใช้ที่ชำระเงินพิมพ์และส่งคีย์ 'ผิดพิมพ์ / สะกดผิด' (typo) คีย์ไปยังเซิร์ฟเวอร์เป็นไปได้เสมอ
พระนารายณ์

@Vishnu ฉันรู้ว่าในฐานะผู้ใช้ที่พิมพ์คีย์ฉันต้องการตรวจสอบข้อมูลต่อกลุ่มแม้ว่าจะหมายถึงการพิมพ์คีย์ที่ยาวขึ้น
Loren Pechtel

16

ไม่มีความประหยัด 100% แต่คุณสามารถเริ่มต้นด้วยวิธีที่ค่อนข้างง่าย:

  • คุณจะต้องใช้วิธีตรวจสอบคีย์ที่สร้างขึ้นเช่นเช็คซัมที่รวมอยู่ แน่นอนว่าต้องไม่ง่ายเกินไปที่จะเข้าใจ

  • ทางเลือก (แต่แนะนำ) จะมีฐานข้อมูลฝั่งเซิร์ฟเวอร์ทำการตรวจสอบคีย์ด้วยฐานข้อมูลของคีย์ที่ให้ทั้งหมดดังนั้นคุณจึงไม่สามารถสร้างคีย์ได้แม้ว่าคุณจะเกิดอัลกอริธึมก็ตาม

จากตรงนั้นคุณสามารถมีสองวิธีที่แตกต่างกัน แต่ด้วยวิธีใดสิ่งหนึ่งที่สำคัญมาก:

  • อย่าตรวจสอบคีย์บนฝั่งไคลเอ็นต์ สิ่งนี้สำคัญมากเพราะจริงๆแล้วมันค่อนข้างง่ายในการถอดรหัสสิ่งที่เขียนด้วย. net / XNA หากคุณต้องขอคีย์หรือส่งรหัสผ่าน (ลงชื่อเข้าใช้หรือลงทะเบียน) แฮชคีย์ (ด้วยการเพิ่มเกลือเป็นต้น) และส่งไปยังเซิร์ฟเวอร์

สำหรับเส้นทางที่เกิดขึ้นจริง:

  • ต้องการให้ส่งคีย์แฮช (ดูด้านบน) ในระหว่างกระบวนการตรวจสอบ / ล็อกอิน

  • เป็นทางเลือก (IMO ที่ดีกว่าถึงแม้ว่าหลาย ๆ คนไม่ชอบ "DRM" ประเภทนี้): อย่าใช้กุญแจในไคลเอนต์เลย แต่ต้องการให้ผู้ใช้ลงชื่อเข้าใช้บัญชีและต้องใช้รหัสซีดีที่ถูกต้อง (ต้องใช้ฐานข้อมูลที่กล่าวถึงข้างต้น) เพื่อสร้างบัญชี นี่คือวิธีที่เกมทันสมัยเช่น MMORPG ที่จ่ายเพื่อเล่นจัดการสิ่งนี้

โดยส่วนตัวแล้วฉันจะใช้วิธีการทางบัญชีเนื่องจากเหตุผลง่าย ๆ : ในที่สุดคุณไม่สามารถป้องกันไม่ให้ผู้อื่นขโมยกุญแจซีดี (bruteforcing, reverse engineering หรือ scamming) ผู้คนสามารถสร้างคีย์ใหม่เพื่อเล่นต่อหรือล็อคผู้อื่นจากเกม ด้วยบัญชีที่ถูกผูกไว้คีย์ไม่มีใครสามารถทำอะไรกับคีย์ที่ใช้งานอยู่แล้ว ในกรณีที่มีคนซื้อกุญแจคนอื่นที่สร้างขึ้นคุณยังสามารถถ่ายโอนความเป็นเจ้าของบัญชีโดยมีหลักฐานเพียงพอ


2
แทนที่จะใช้เช็คซัมมาตรฐานคุณควรใช้อัลกอริทึมการแฮชแบบเข้ารหัสลับ คุณสามารถเก็บรหัสส่วนตัวบนเซิร์ฟเวอร์และมอบรหัสสาธารณะให้กับลูกค้าจากนั้นคุณรู้ว่าไม่สามารถเข้าถึงเซิร์ฟเวอร์ได้ระบบจะปลอดภัย
อดัม

@Adam: การใช้อัลกอริทึมการเข้ารหัสลับที่มีความปลอดภัยแบบเข้ารหัสลับจะช่วยให้ผู้โจมตีไม่สามารถสร้างคีย์ที่ถูกต้องได้ แต่ปัญหาดังกล่าวไม่สามารถแก้ไขได้โดยหน่วยงานที่รับผิดชอบในการแจกคีย์ที่ถูกกฎหมาย ในขณะที่การตรวจสอบอย่างง่ายไม่ปลอดภัยมากฟังก์ชันทางเดียวไม่สามารถใช้งานได้ในบริบทนี้
Marcks Thomas

คุณสามารถรวมทั้งสองอย่างเช่นทำให้ส่วนแรกของคีย์เป็นการรวมกันแบบสุ่มของตัวละครและแฮชครึ่งหลัง ใครก็ตามที่ขายเกมไม่สามารถใช้ keygen ได้ (เว้นแต่จะมีวิธีที่จะทำให้แน่ใจว่าไม่มีการชน / ความขัดแย้งเกิดขึ้นเช่น "รหัสผู้ขาย" เป็นส่วนหนึ่งของคีย์)
มาริโอ

1

Pangea Software - ผู้ดูแลเกม Mac หลายเกมได้เขียนหัวข้อเกี่ยวกับการป้องกันการลอกในหนังสือพัฒนาเกม (ตอนนี้ฟรี) หนังสือเล่มนี้ยังอธิบายถึงวิธีจัดการกับกุญแจละเมิดลิขสิทธิ์และการแฮ็กคนอื่น ๆ ที่ใช้ หนังสือเล่มนี้ให้ความสำคัญกับการพัฒนาเกม Mac แต่ความคิดอาจยังคงมีประโยชน์สำหรับแพลตฟอร์มอื่น ๆ ที่มาพร้อมกับหนังสือเล่มนี้คือซอร์สโค้ดสำหรับแต่ละบทส่วนหนึ่งของการดาวน์โหลดด้านล่าง นอกจากนี้ยังมีซอร์สโค้ด (เขียนเป็นภาษา C) ซึ่งรวมถึงการป้องกันการคัดลอก

หนังสือเล่มนี้สามารถดาวน์โหลดได้ที่นี่


ฉันไม่พบสิ่งที่มีประโยชน์ในหนังสือเล่มนั้น
user1306322

โดยส่วนตัวฉันว่าบทที่ 16 มีเคล็ดลับดี ๆ แต่ YMMV
Wolfgang Schreurs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.