Тема: Генерування уінакльного хешу для звязки клієнта та сервера.
Всім привіт, останнім часом почав сильно задумуватися над безпекою ігрового лаунчера, який зробив для minecraft сервера.
Суть полягає у тому, що в лаунчері перевіряється хеш деяких файлів. Якщо хеш не співпадає, то авторизація не проходить.
Але от біда у тому, що коди цього лаунчера якраз є у мережі, та й можна обійти навіть сам лаунчер.
Перевірка хешу файлів відбувається для того, щоб запобігти появі чітерів.
Отож, як працює лаунчер:
1) Появляється вікно, з 2 полями та кнопкою. Юзер вводить логін і пароль, натискає кнопку авторизуватися.
2) Лаунчер перевіряє хеш(md5 та sha1) одного файлу. Якщо хеш не співпадає, запит на сервер не подається.
3) Якщо хеш співпадає, відправляється запит на скрипт xAuth.php з параметрами login=Його_нік&password=його_пасс
4) На сервері перевіряється логін і пасс, якщо все вірно, створюється запис із сесією для нього у бд, і віддається результат типу:
різні_букви_і_цифри:Нік_гравця ну тобто щось таке: a6fba7a0e6f104f:Hanter
Ті букви і цифри - то ідентифікатр сесії.
5) Якщо сервер відповів результатом типу як показано вище, він запускає сам minecraft з різними параметрами, і в одному із параметрів є якраз той ідентифікатор сесії. Без нього на сервер не зайдеш.
Все було б добре, якби не одне але.
Чітер може взяти вихідні коди лаунчера, і скомпілювати його так, що він буде посилати точно такий же запит як і мій, але без перевірки файлів. Тут він і має пряму дорогу до встановлення різних чітів.
Другий метод, взагалі без лаунчера. Чітер напряму звертається до файлу xAuth.php з потрібними параметрами(логін і пасс) і отримує якраз id сесії. Далі він бере і запускає minecraft з типу: java -jar -session=те_що_отримав /bin/minecraft.jar і все.
Так двома способами можна обійти лаунчер.
І в мене виникла така ідея. Розробити якийсь алгоритм, який при запуску лаунчера генерує своєрідний хеш чи щось таке, і коли йде запит до xAuth.php воно в той запит додає ще наприклад ?hash=те_що_згенерувало. Сервер в свою чегру перевіряє чи вірний хеш. Якщо не вірний або відсутній зразу посилає. Але от біда в тому, що якщо хеш буде постійно однаковий, то чітер це побачить і це не складе проблеми знову ж таки обійти лаунчер.
І от я подумав, а що якщо зробити так, що хеш буде кожного разу унікальний і не буде повторятися. І тут знову проблема, як зробити так, щоб сервер знав чи хеш вірний чи ні ? І взагалі, підкажіть будь ласка ще якісь методи захисту. Може хтось робив щось подібне ?