วิธีการแยกการเข้าสู่ระบบและตรรกะของเกมเมื่อเขียนเซิร์ฟเวอร์?


9

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


4
YAGNI: คุณไม่ต้องการมัน อย่าใช้การเพิ่มประสิทธิภาพก่อนวัยอันควร การเข้าสู่ระบบดูเหมือนเป็นส่วนที่ไม่สำคัญของเกมโดยแยกออกมาไม่น่าจะให้ประโยชน์ใด ๆ เมื่อเกมของคุณมีผู้ใช้มากพอที่คุณสนใจ (คุณควรจะสามารถรองรับผู้ใช้ 1,000 คนบนเซิร์ฟเวอร์เดียวกับผู้อื่นเพียงเพื่อความซ้ำซ้อน) คุณจะสามารถจ้างวิศวกรซอฟต์แวร์บางคนที่เข้าใจสิ่งนี้
MarkR

คุณยอมรับคำตอบที่ทำให้เข้าใจผิดคุณควรพิจารณาอีกครั้งว่าอย่างระมัดระวังหรือคุณจะจบลงด้วยความคิดผิด ๆ ในหัวของคุณและความรู้สึกผิด ๆ ในรหัสของคุณ
o0 '

ฉันชอบคำตอบของ Kylotan เพราะฉันไม่จำเป็นต้องมีการเชื่อมต่อเพิ่มเติมระหว่างเซิร์ฟเวอร์เกมและเซิร์ฟเวอร์การเข้าสู่ระบบฉันยังสามารถเห็นประเด็นของ Philip ที่การประนีประนอมคีย์ลับเป็นการประนีประนอมกับบัญชีทั้งหมดที่มีการขนส่งสินค้า ฉันจะติดตั้งทั้งสองเวอร์ชันและถามผู้เชี่ยวชาญด้านความปลอดภัยเมื่อฉันได้รับการตรวจสอบรหัสของฉัน คำถามของฉันดูเหมือนพื้นฐานและฉันคาดหวังว่าพวกเขาจะเป็นทางออกมาตรฐานที่ทุกคนเห็นด้วย ไปคิด หากผู้เชี่ยวชาญด้านความปลอดภัยเท่านั้นที่สามารถเข้าร่วมการสนทนาและตัดสินใจ
user342580

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

คำตอบ:


3

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

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

งานนี้เพราะ:

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

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

เช่นเดียวกับการรักษาความปลอดภัยที่เน้นการใช้ hash ฟังก์ชั่นที่ดีที่สุดที่คุณจะได้รับ - ในขณะที่ผู้คนดูเหมือนจะชอบ bcrypt, PBKDF2 และ scrypt - และตรวจสอบให้แน่ใจว่าคีย์ลับของคุณยาวมาก


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

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

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

@ user342580: ฉันจะใช้วลียาว ๆ ไม่จำเป็นต้องมีความแตกต่างกันต่อผู้ใช้ แต่ถ้าเป็นเช่นนั้นก็จะไม่เจ็บ ตราบใดที่ฟังก์ชั่นแฮชของ crypto นั้นแข็งแกร่งพอและคุณเปลี่ยนมันเป็นระยะ ๆ มันก็ไม่สำคัญ
Kylotan

@Kylotan อย่างแน่นอนและคุณให้กุญแจแก่พวกเขาอย่างไร ทำไมคุณถึงพิจารณาว่าการเชื่อมต่อจากคุณกับเซิร์ฟเวอร์มีความปลอดภัยมากกว่าการเชื่อมต่อจากเซิร์ฟเวอร์หนึ่งไปอีกเซิร์ฟเวอร์หนึ่ง
o0 '

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

  2. เซิร์ฟเวอร์เข้าสู่ระบบเลือกเซิร์ฟเวอร์เกม ส่งโทเค็นชื่อผู้ใช้และข้อมูลที่เกี่ยวข้องอื่น ๆ ทั้งหมดเกี่ยวกับผู้ใช้จากเซิร์ฟเวอร์เข้าสู่เซิร์ฟเวอร์ที่เลือก

  3. ส่งโทเค็นและชื่อโฮสต์ของ gameserver ไปยังไคลเอนต์ จากนั้นตัดการเชื่อมต่อจากเซิร์ฟเวอร์เข้าสู่ระบบ

  4. ไคลเอนต์เชื่อมต่อกับ gameserver ด้วยชื่อผู้ใช้และโทเค็น

  5. เมื่อโทเค็นจากไคลเอนต์ตรงกับที่รายงานเพียงโดย loginserver คุณยอมรับมัน

โปรดทราบว่าเพื่อให้สิ่งนี้มีความปลอดภัยโทเค็นจะต้องถูกสร้างขึ้นจากเครื่องสร้างตัวเลขสุ่มที่เข้ารหัสลับการเข้ารหัสแต่ละโทเค็นอาจได้รับการยอมรับเพียงครั้งเดียวโดย gameserver และโทเค็นที่ไม่ได้ใช้ควรทิ้งหลังจากนั้นไม่กี่นาที


ดังนั้นจะใช้ bcrypt เพียงพอหรือไม่ ฉันกำลังคิดที่จะสร้างโทเค็นจากแฮชของเวลา + ชื่อผู้ใช้ + รหัสผ่านโดยใช้ bcrypt
342580

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

1
bcrypt ทำงานตราบใดที่อินพุตนั้นสุ่มและไม่เหมาะสม หากคุณเพียงแค่ใช้เวลาผู้โจมตีสามารถลองทำนายเวลาจากนั้นรัน bcrypt และรับโทเค็น ต้องแน่ใจว่าใช้เกลือลับกับเวลาหรือเครื่องมือสุ่มปลอดภัย (เช่น / dev / random บนระบบ UNIX / Linux)
Sean Middleditch

รหัสผ่านอาจถูกบุกรุกในเว็บไซต์อื่นดังนั้นฉันจึงหลีกเลี่ยงการสมมติว่าเป็นความลับที่เหมาะสม
Sean Middleditch

1
@SeanMiddleditch เมื่อรหัสผ่านถูกบุกรุกความปลอดภัยทั้งหมดจะหายไป ผู้โจมตีที่ได้รับรหัสผ่านนั้นไม่มีเหตุผลที่จะเดาโทเค็นเพราะเขาสามารถทำได้โดยการเข้าสู่ระบบตามปกติ
ฟิลิปป์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.