Làm thế nào để phân chia đăng nhập và logic trò chơi khi viết máy chủ?


9

Tôi đang xây dựng một máy xì phé giống như máy chủ trò chơi, tôi sẽ xử lý tất cả thông tin đăng nhập và logic trò chơi trên một máy chủ, nhưng từ nghiên cứu của tôi trên web, tôi biết rằng điều này sẽ không mở rộng và sẽ hợp lý khi chia công việc vào một máy chủ đăng nhập và trò chơi. Nhưng những gì tôi không nhận được là sau khi tôi xử lý xác thực trong máy chủ đăng nhập và khách hàng tạo kết nối mới với máy chủ trò chơi, làm sao tôi biết khách hàng nào là khách hàng? Tôi sẽ không phải đăng nhập lại và do đó đánh bại mục đích có máy chủ để đăng nhập? Có cách nào để vượt qua kết nối qua các quy trình và máy móc mà tôi không biết? Xin lỗi kiến ​​thức nhỏ của tôi về mạng.


4
YAGNI: bạn sẽ không cần nó. Đừng thực hiện tối ưu hóa sớm. Đăng nhập nghe có vẻ như là một phần rất nhỏ của trò chơi, việc chia tách nó không có khả năng mang lại bất kỳ lợi ích nào; khi trò chơi của bạn có đủ người dùng mà bạn quan tâm (bạn sẽ có thể hỗ trợ 1000 người dùng trên một máy chủ, với những người khác chỉ để dự phòng), bạn sẽ có thể thuê một số kỹ sư phần mềm hiểu loại điều này.
MarkR

Bạn đã chấp nhận một câu trả lời sai lệch, bạn nên xem xét lại một cách cẩn thận, hoặc bạn sẽ kết thúc với những quan niệm sai lầm trong đầu và với một cảm giác an toàn sai lầm trong mã của bạn.
o0 '.

Tôi thích câu trả lời của Kylotan vì tôi không cần phải có thêm kết nối giữa máy chủ trò chơi và máy chủ đăng nhập, tôi cũng có thể thấy quan điểm của Philip rằng sự thỏa hiệp của khóa bí mật là sự thỏa hiệp đối với tất cả các tài khoản đang vận chuyển. Tôi sẽ thực hiện cả hai phiên bản đăng nhập và hỏi một chuyên gia bảo mật khi tôi kiểm tra mã của mình. Câu hỏi của tôi có vẻ khá cơ bản và tôi mong rằng đó sẽ là một giải pháp chuẩn mà mọi người đều đồng ý. Đi hình. Nếu chỉ có một chuyên gia bảo mật có thể đến trong cuộc thảo luận này và đưa ra quyết định.
dùng342580

Nói một cách chính xác việc chuyển mã thông báo đăng nhập giữa các máy chủ của bạn sẽ an toàn hơn, cung cấp cho bạn một kênh bảo mật để thực hiện. Nó cũng khó thực hiện hơn làm tăng nguy cơ bạn mắc sai lầm. Hệ thống xác thực tin nhắn dựa trên hàm băm phải hoàn toàn an toàn trừ khi ai đó có thể giữ khóa bí mật của bạn - và nếu họ có thể giữ khóa của bạn thông qua quyền truy cập vào hệ thống nội bộ của bạn, bạn sẽ gặp sự cố không thể khắc phục bằng cách gửi thông tin đăng nhập mã thông báo thủ công.
Kylotan

Câu trả lời:


3

Mặc dù câu trả lời của Philipp là hoàn toàn tốt, nhưng có một cách hơi khác không yêu cầu kết nối giữa máy chủ đăng nhập và máy chủ trò chơi, rất hữu ích nếu kết nối như vậy khó khăn.

  1. Khi người dùng xác thực thành công trên máy chủ đăng nhập, họ sẽ được gửi một địa chỉ máy chủ trò chơi và mã thông báo đăng nhập như trên. Tuy nhiên, mã thông báo này bao gồm 2 phần: thời gian trên máy chủ đăng nhập và hàm băm của số đó cộng với tên người dùng, địa chỉ IP của họ, địa chỉ IP hoặc ID của máy chủ trò chơi và khóa bí mật mà chỉ bạn biết.
  2. Máy khách cố gắng đăng nhập vào máy chủ trò chơi được cung cấp bằng cách gửi mã thông báo này. Máy chủ hình thành hàm băm giống như trước đây, dựa trên thông tin trong mã thông báo đăng nhập cộng với địa chỉ IP / ID riêng và khóa bí mật. Nếu hàm băm này khớp với mã trong mã thông báo, bạn sẽ biết trình phát được xác thực đúng. Sau đó kiểm tra ngày không quá cũ (ví dụ: hơn 1 phút).

Điều này hoạt động vì:

  • Nó không thể được sao chép và sử dụng lại vì ngày sẽ hết hạn.
  • Nó không thể được xây dựng mà không có thông tin đăng nhập mới mà không biết khóa bí mật.
  • Nó không thể dễ dàng bị chặn bởi người khác (ví dụ: với trình thám thính gói) và được sử dụng vì địa chỉ IP ban đầu được sử dụng để xây dựng nó.
  • Nó không thể được sử dụng cho một tài khoản khác vì tên người dùng tạo thành một phần của hàm băm.
  • Nó không thể được sử dụng để đăng nhập đồng thời trên các máy chủ trò chơi khác nhau vì địa chỉ ID / IP của máy chủ tạo thành một phần của hàm băm.

Hoặc nói một cách đơn giản hơn, hàm băm đảm bảo rằng người gửi gần như không thể giả mạo mã thông báo đăng nhập của họ và vì vậy thông tin trong mã thông báo có thể được tin cậy.

Như với bất kỳ băm định hướng bảo mật nào, hãy sử dụng hàm băm tốt nhất bạn có thể nhận được - tại thời điểm mọi người dường như thích bcrypt, PBKDF2 và mã hóa - và đảm bảo khóa bí mật của bạn rất dài để việc tái tạo lực lượng vũ phu trở nên kém thực tế.


Rất thông minh, tôi rất thích giải pháp này. Câu hỏi của tôi là chìa khóa bí mật. Nó nên giống như một cụm từ hoặc một cái gì đó? Và nó có nên khác nhau cho mỗi người dùng?
dùng342580

Điều này không hoạt động, hoặc, nó thực sự là một triển khai lại ẩn của câu trả lời của @ Philipp. Nó thất bại bởi vì nó giả định rằng cả máy chủ đăng nhập và máy chủ trò chơi đều biết cùng một khóa bí mật. Nếu cả hai đều biết chìa khóa, một trong số họ phải liên hệ với người kia để cung cấp nó. Hoặc bạn cần một bên thứ ba để gửi nó cho cả hai. Dù bằng cách nào, nó vẫn có thể đánh hơi được như trước.
o0 '.

@Lohoris, ý tưởng là bạn sở hữu cả máy chủ đăng nhập và máy chủ trò chơi và có thể cung cấp cho họ khóa bí mật. Nếu bạn không sở hữu cả hai máy chủ, làm sao máy chủ trò chơi có thể tin tưởng vào xác thực của máy chủ đăng nhập?
Kylotan

@ user342580: Tôi sẽ sử dụng một cụm từ dài của một số loại. Nó không phải khác nhau cho mỗi người dùng, nhưng nếu có, điều đó sẽ không gây hại. Miễn là hàm băm mật mã đủ mạnh và bạn thay đổi định kỳ thì không thành vấn đề.
Kylotan

@Kylotan chính xác, và làm thế nào để bạn cung cấp cho họ chìa khóa? Tại sao bạn xem xét an toàn hơn kết nối từ bạn đến máy chủ, hơn là từ máy chủ đến máy chủ?
o0 '.

8
  1. Sau khi người dùng tự xác thực với máy chủ đăng nhập, hãy cung cấp cho nó mã thông báo (một chuỗi duy nhất, được tạo ngẫu nhiên quá lâu để có thể đoán được).

  2. Loginserver chọn một máy chủ trò chơi. Gửi mã thông báo, tên người dùng và tất cả dữ liệu có liên quan khác về người dùng từ máy chủ đăng nhập đến máy chủ mà họ đã chọn.

  3. Gửi mã thông báo và tên máy chủ của máy chủ trò chơi cho khách hàng. Sau đó ngắt kết nối nó khỏi máy chủ đăng nhập.

  4. Sau đó, khách hàng kết nối với máy chủ trò chơi bằng tên người dùng và mã thông báo.

  5. Khi mã thông báo từ máy khách khớp với mã được báo cáo bởi máy chủ đăng nhập, bạn chấp nhận nó.

Lưu ý rằng để bảo mật điều này, các mã thông báo cần phải được tạo từ trình tạo số ngẫu nhiên an toàn bằng mật mã, mỗi mã thông báo chỉ có thể được chấp nhận một lần bởi máy chủ trò chơi và các mã thông báo không được sử dụng phải được loại bỏ sau vài phút.


Vì vậy, sử dụng bcrypt là đủ? Tôi đang nghĩ đến việc tạo mã thông báo từ hàm băm của thời gian + tên người dùng + mật khẩu bằng bcrypt.
dùng342580

Tôi đoán nó sẽ. Người ta có thể đoán mã thông báo khi biết mật khẩu, nhưng khi bạn biết mật khẩu, bạn chỉ có thể đăng nhập theo cách thông thường.
Philipp

1
bcrypt hoạt động miễn là đầu vào phù hợp ngẫu nhiên và không thể chấp nhận được. Nếu bạn chỉ sử dụng thời gian, kẻ tấn công có thể cố gắng dự đoán thời gian, sau đó chạy bcrypt và nhận mã thông báo. Hãy chắc chắn sử dụng một loại muối bí mật theo thời gian hoặc một bộ ngẫu nhiên an toàn (ví dụ / dev / ngẫu nhiên trên các hệ thống UNIX / Linux).
Sean Middleditch

Mật khẩu có thể đã bị xâm phạm trên một trang web khác, vì vậy tôi tránh cho rằng đó là một bí mật phù hợp.
Sean Middleditch

1
@SeanMiddleditch Khi mật khẩu bị xâm phạm, mọi bảo mật sẽ bị mất. Kẻ tấn công lấy được mật khẩu không có lý do để đoán mã thông báo, bởi vì anh ta chỉ có thể lấy một mật khẩu bằng cách đăng nhập theo cách thông thường.
Philipp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.