Як розділити логіку входу та гри при написанні серверів?


9

Я будую покер, як ігровий сервер, я мав би мати всі входи та логіку гри для обробки на одному сервері, але з мого дослідження в Інтернеті я дізнаюся, що це не буде масштабуватися, і було б сенс розділити робота над серверами для входу та гри. Але те, що я не отримую - це після того, як я обробляв автентифікацію на сервері входу і мав клієнт встановити нове з'єднання з ігровим сервером, як я можу знати, який саме клієнт є? Чи не довелося б мені знову входити в систему і таким чином перемогти мету мати сервер для входу? Чи є спосіб передати з'єднання між процесами та машинами, про які я не знаю? Вибачте мої незначні знання в мережі.


4
ЯГНІ: вам це не потрібно. Не застосовуйте передчасну оптимізацію. Увійти звучить як дуже тривіальна частина гри, роздвоєння якої навряд чи дасть користь; як тільки у вашій грі буде достатньо користувачів, які вам цікаві (ви повинні мати можливість підтримувати 1000 користувачів на одному сервері, а інші лише для надмірності), ви зможете найняти інженерів програмного забезпечення, які розуміють подібні речі.
MarkR

Ви прийняли оманливу відповідь, вам слід це ретельно переглянути, інакше ви виявитеся з помилковими поняттями в голові та з помилковим почуттям безпеки у своєму коді.
o0 '.

Мені сподобалась відповідь Kylotan, оскільки мені не потрібно мати додаткового зв’язку між ігровими серверами та сервером входу, я також бачу думку Філіпа, що компроміс секретного ключа - це компроміс для всіх рахунків, які здійснюють доставку. Я буду реалізовувати обидві версії для входу і запитати експерта з питань безпеки, коли я перевірятиму свій код. Моє питання видається досить базовим, і я очікував, що їхнє рішення буде стандартним рішенням, про яке всі згодні. Піди розберися. Якщо в цій дискусії може взяти участь лише експерт з питань безпеки та прийняти рішення.
користувач342580

Строго кажучи, передача маркера для входу між вашими серверами є більш безпечним, якщо у вас є безпечний канал для цього. Це також важче здійснити, що збільшує ризик неправильного отримання. Система аутентифікації повідомлень на основі хешу повинна бути абсолютно безпечною, якщо хтось не зможе отримати ваш секретний ключ - і якщо вони зможуть отримати ваш ключ через доступ до ваших внутрішніх систем, у вас виникнуть проблеми, які не виправлять, надіславши логін жетони вручну.
Kylotan

Відповіді:


3

Хоча відповідь Філіпа ідеально хороша, є дещо інший спосіб, який не вимагає з'єднання між сервером входу та ігровим сервером, що корисно, якщо таке з'єднання важке.

  1. Коли користувач успішно аутентифікується на сервері входу, їм надсилається адреса сервера ігор та маркер входу, як зазначено вище. Однак цей маркер складається з 2 частин: час перебування на сервері входу та хеш цього номера плюс їх ім'я користувача, їх IP-адреса, IP-адреса або ідентифікатор ігрового сервера та секретний ключ, який ви знаєте лише ви.
  2. Клієнт намагається увійти на наданий ігровий сервер, надіславши цей маркер. Сервер формує той же хеш, що і раніше, на основі інформації в маркері входу, плюс власної IP-адреси / ідентифікатора та секретного ключа. Якщо цей хеш відповідає тому, що знаходиться в маркері, ви знаєте, що гравець має автентифікацію належним чином. Потім перевірте, чи дата не надто стара (наприклад, більше 1 хвилини).

Це працює тому, що:

  • Його неможливо скопіювати та повторно використовувати, оскільки дата закінчується.
  • Його неможливо побудувати без свіжого входу, не знаючи секретного ключа.
  • Хтось інший (наприклад, за допомогою sniffer пакетів) його не може легко перехопити та використовувати, оскільки для його побудови використовується оригінальна IP-адреса.
  • Його не можна використовувати для іншого облікового запису, оскільки ім'я користувача є частиною хешу.
  • Його не можна використовувати для одночасних входів на різних ігрових серверах, оскільки ID / IP-адреса сервера є частиною хеша.

Або простіше кажучи, хеш гарантує, що відправник майже неможливо сфальсифікувати свій маркер для входу, і тому інформації в маркері можна довіряти.

Як і будь-яке хеш-орієнтоване на безпеку, використовуйте найкращу хеш-функцію, яку ви можете отримати - на даний момент людям здається, що вони люблять bcrypt, PBKDF2 та scrypt - і переконайтесь, що ваш секретний ключ дуже довгий, щоб зробити відтворення грубої сили менш практичним.


Дуже розумно, я дуже віддаю перевагу цьому рішенню. Моє запитання - це секретний ключ. Це має бути як пропускна фраза чи щось таке? І чи має воно бути різним для кожного користувача?
користувач342580

Це не працює, або це фактично прихована повторна реалізація відповіді @ Філіпа. Він не працює, оскільки передбачає, що і сервер входу, і сервер ігор знають той самий секретний ключ. Якщо вони обоє знають ключ, один з них повинен зв’язатися з іншим, щоб надати його. Або вам потрібна третя сторона, щоб надіслати їх обом. У будь-якому випадку це так само нюхально, як і раніше.
o0 '.

@Lohoris, ідея полягає в тому, що ви володієте як входом, так і ігровим сервером і можете надати їм секретний ключ. Якщо ви не володіли обома серверами, як ігровий сервер взагалі може довіряти аутентифікації сервера входу?
Kylotan

@ user342580: Я б використовував довгу якусь фразу. Це не повинно відрізнятися на кожного користувача, але якби це було, це не зашкодило б. Поки функція криптовалути досить сильна, і ви періодично її змінюєте, це не має значення.
Kylotan

@Kylotan саме, і як ви надаєте їм ключ? Чому ви вважаєте більш безпечним з'єднання від вас до серверів, ніж це від сервера до сервера?
o0 '.

8
  1. Після того, як користувач пройшов автентифікацію на сервері входу, надайте йому маркер (унікальна, випадково згенерована рядок, занадто довга для того, щоб здогадуватися).

  2. Логінсер вибирає ігровий сервер. Надішліть маркер, ім’я користувача та всі інші релевантні дані про користувача з сервера входу на обраний ним сервер.

  3. Надішліть клієнтові маркер і ім'я хоста сервера ігор. Потім від'єднайте його від сервера входу.

  4. Потім клієнт підключається до ігрового сервера своїм іменем користувача та маркером.

  5. Коли маркер від клієнта відповідає тому, що щойно повідомив сервер реєстрації, ви приймаєте його.

Зауважте, що для того, щоб це було безпечно, маркери повинні бути створені з криптографічно захищеного генератора випадкових чисел, кожен маркер може бути прийнятий сервером ігор лише один раз, а невикористані жетони повинні бути відкинуті через кілька хвилин.


Отже, чи достатньо використання bcrypt? Я думаю створити маркер з хешу часу + ім’я користувача + пароль за допомогою bcrypt.
користувач342580

Я здогадуюсь. Можна було вгадати маркер, коли знаєш пароль, але коли ти знаєш пароль, ти можеш просто увійти в звичайний спосіб.
Філіпп

1
bcrypt працює до тих пір, поки вхід є відповідним випадковим і непридатним. Якщо ви просто використовуєте час, зловмисник може спробувати передбачити час, а потім запустити bcrypt і отримати маркер. Обов’язково використовуйте таємну сіль із часом або захищеним рандомизатором (наприклад, / dev / random в системах UNIX / Linux).
Шон Міддлічч

Можливо, пароль був зірваний на іншому веб-сайті, тому я б не припускав, що це підходящий секрет.
Шон Міддлічч

1
@SeanMiddleditch Коли пароль порушений, вся безпека все одно втрачається. Зловмисник, який отримав пароль, не має підстав здогадуватися про маркер, оскільки він міг просто отримати його, увійшовши в звичайний спосіб.
Філіпп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.