Аутентификация для многопользовательской игры через сокеты
11
Я реализую протокол пользовательских двоичный для новой многопользовательской игры я работаю. Его пошаговая стратегия игра так времени на самом деле не имеет значения. В настоящее время я получил часть основных данных синхронизации системы завершенного, и мне было интересно, как пользователь Войти / выход из системы и шифрование, как правило, делается для игр MMORPG или аналогичных.
Вы можете рекомендовать схему безопасной / секретной передачи пароля при входе в систему? (Обмен ключами Диффи-Хеллмана?)
Как реализовать надежное шифрование для пакетов данных? (AES 128-бит? .. или какой схеме это сообщение относится как «шифрование сильнее , чем вы, вероятно, трещина»)
Существует ли какое-дейтаграммы схема формата, которые помогают затвердевают игровой сервер от атак, недействительные пакеты данных и т.п.?
SRP - безопасный пароль удаленного доступа - основан на Диффи-Хеллмане. Идея заключается в том, что вы можете выполнить взаимную проверку пароля, фактически не передавая пароль или любую информацию, которая может быть использована для его получения. Даже при том, что это безопасно по сети, вы все равно должны хешировать и хранить свои пароли, поскольку ваш сервер никогда не должен хранить их в виде простого текста .
Преимущество SRP заключается в том, что после его завершения он также дает вам согласованный ключ шифрования, который злоумышленник не смог бы вывести, учитывая данные, которые вы передали. Это означает, что вы можете использовать алгоритм симметричного шифрования (например, AES) после аутентификации пользователя.
Предполагая, что вы используете UDP с вашей собственной надежной / упорядоченной (ориентированной на соединение) реализацией поверх нее: зашифруйте всю UDP-нагрузку, включая ваш «порядковый номер пакета». Если ваша система спроектирована правильно, она автоматически отклонит воспроизводимые сообщения, и злоумышленник не сможет изменить порядковый номер пакета, поскольку он зашифрован (таким образом, воспроизведение возможно, но оно будет автоматически проигнорировано).
мысли
Ваша аутентификация должна быть безопасной? Абсолютно. Не идите на компромисс с точки зрения безопасности, когда пароль под вопросом. Таким образом, вы должны определенно рассмотреть первую пулю в моем ответе.
Должны ли ваши данные быть в безопасности? Только если это внутриигровая покупка / микротранзакция - и почему бы просто не использовать что-то проверенное и верное, как HTTPS. Шифрование игрового трафика вряд ли является жизнеспособным решением по следующим причинам:
Это полная паранойя.
Это увеличит время процессора на вашем сервере, если только вы не купите (дорогие) аппаратные модули шифрования.
Неважно, какую безопасность вы обеспечиваете для своих данных по сети - кто-то может захватить клиентский процесс и перехватить сообщения за мгновение до того, как они будут зашифрованы и отправлены. Это не только возможность, но и бесконечно более возможная, так как существенно проще вводить код по сравнению с перехватом пакетов. Если вы делаете это для предотвращения мошенничества, вы теряете свое время.
С точки зрения безопасности пароля, к сожалению, вы ничего не можете поделать с угнанной системой, клиент стал враждебным. Ключи Blizzards WoW предназначены для решения этой проблемы, но я не уверен, насколько это безопасно (особенно, если вы оставите его подключенным).
Пожалуйста, если вы используете шифрование для предотвращения мошенничества, откажитесь от него. Вы собираетесь сказать коротко - я дал вам информацию в случае, если вы не. Помните, что вы можете выборочно шифровать пакеты по первому байту в пакете и показывать, зашифрованы ли остальные: хотя, еще раз, я бы придерживался HTTPS, если вам нужно делать такие вещи, как транзакции по кредитным картам: они крайне редки и HTTPS разработан экспертами - в отличие от того, что вы или я разработали.
Все , что сказал, Blizzard фактически шифровать их WoW трафик. Основная причина этого является сломало , потому что кто - то, кто, вероятно , полный дилетант, решил , что они пробуют свои силы в алгоритме шифрования доморощенного; это приготовлено действительно хорошо . Даже если вы делаете стандартные использование промышленных алгоритмов есть хороший шанс , что кто - то перепроектировать код и моделировать его - как только клиент вводит свой пароль , не существует никакого сообщения , что неподдерживаемая система подключена.
+1 утверждать , что шифрование пакетов данных для накрутки профилактики бесполезно. OP: не проверить , все вы получите от клиента, запуск проверки вменяемости, перепроверить , если запрошенное действие клиента возможно, диапазоны проверки оружия, скорость движения и т.д. , но не тратить время на обеспечение своего клиента , как он будет взломан , если ваша игра стоит. Некоторая многопользовательская компания шифровать и запутать свои клиент / протоколы , но это не предотвратить мошенничество , но чтобы сделать его более трудным для например , создателей бот , чтобы получить хорошие результаты, и даже это делается специализированными группами экспертов.
Gilead
1
Незначительные каламбуры о своем третьем ответе: только шифрование пакетов не могут быть достаточно , чтобы предотвратить фальсификации, так как многие схемы шифрования, по крайней мере , несколько податливых . Для целостности защитите сообщение, Вам необходимо либо MAC или режим проверки подлинности шифрования .
Ilmari Karonen
+1 Спасибо за очень полный ответ. Глядя в реализации SRP прямо сейчас. Что вы рекомендации относительно используемой хэш - функции для паролей? MD5? Как бы OTR протокол (отключить запись) быть для такого сценария использования? она будет работать хорошо для авториза / крипто вместо SRP? В случае использования я SRP, я должен был бы использовать один из следующих режимов : «подлинности шифрования»? (ОСВ 2,0, Key Wrap, CCM, EAX, шифровать-то-MAC и GCM)
Robinicks
1
@Jenko использует семейство алгоритмов SHA (скорее всего, SHA1) - в наши дни вам следует избегать MD5. OTR действительно не то , что вы должны смотреть - он не предназначен , чтобы быть безопасным / затемнить (на самом деле его спроектирована таким образом, что кто - то может более легко подделать пакеты) он также предназначен для обмена мгновенными сообщениями , а не связи машины. Ни один из этих режимов не нужен, просто используйте SRP: если у вас есть согласованный симметричный ключ с взаимной согласованностью, просто возможность что-то зашифровать - это гарантия того, что вы общаетесь с нужной третьей стороной. Кроме того, еще раз перечитайте мои последние два абзаца.
Джонатан Дикинсон
1
На самом деле, у меня есть еще лучшее предложение: использовать существующую реализацию DTLS поверх UDP и не пытаться свернуть свою собственную. Это сэкономит ваше время, и есть много мелких, но важных деталей, которые легко ошибиться, если вы попытаетесь создать свой собственный уровень шифрования дейтаграмм.
Илмари Каронен,
2
Я думаю, что мой последний комментарий к отличному ответу Джонатана стоит расширить на собственный ответ:
Если у вас нет большого опыта в криптовании, вам не следует пытаться создать свой собственный уровень шифрования, если вы можете избежать этого. Если вы делаете много криптографического опыт, вы должны знать лучше , чем создать свой собственный уровень шифрования , если вы можете избежать этого.
Вместо этого попробуйте найти существующую, стандартизированную и хорошо протестированную криптографическую библиотеку, которая делает то, что вам нужно. В вашем случае я бы порекомендовал GnuTLS , который, согласно Википедии , обеспечивает как аутентификацию TLS-SRP ( RFC 5054 ), так и защищенную связь UDP с DTLS ( RFC 6347 ). Первая заботится о входе в систему, а вторая защищает защищенный канал, сформированный таким образом как от перехвата, так и от активных атак, и может даже защитить вас от атак воспроизведения .
Я использую TCP. Это совершенно другой тип игры для конкретного клиента. Подобно азартным играм / ставкам, вся информация, которая может быть использована для захвата процесса, увеличивает вероятность ненужных потерь со стороны дома. Мы должны сохранять данные максимально защищенными, потому что в этом случае информация - это деньги.
Robinicks
Хорошо, если вы используете TCP, то это еще проще: вы можете использовать обычный TLS 1.2 вместо DTLS, что дает вам больше возможностей для выбора. Я все еще рекомендую библиотеку GnuTLS.
Илмари Каронен,
Я проведу небольшое исследование и выясню, смогу ли я сослаться на исходный код TLS на стороне клиента и сервера и основать свой протокол на том, что он делает. Будет ли это достаточно сильным? По сути, это просто шифрование пакетов с некоторым шифром / режимом, правильно?
Robinicks
Нет, в протоколе TLS есть нечто большее . Вот почему вы хотите использовать стандартную библиотеку, которая реализует ее, вместо того, чтобы использовать собственную.
Я думаю, что мой последний комментарий к отличному ответу Джонатана стоит расширить на собственный ответ:
Если у вас нет большого опыта в криптовании, вам не следует пытаться создать свой собственный уровень шифрования, если вы можете избежать этого. Если вы делаете много криптографического опыт, вы должны знать лучше , чем создать свой собственный уровень шифрования , если вы можете избежать этого.
Вместо этого попробуйте найти существующую, стандартизированную и хорошо протестированную криптографическую библиотеку, которая делает то, что вам нужно. В вашем случае я бы порекомендовал GnuTLS , который, согласно Википедии , обеспечивает как аутентификацию TLS-SRP ( RFC 5054 ), так и защищенную связь UDP с DTLS ( RFC 6347 ). Первая заботится о входе в систему, а вторая защищает защищенный канал, сформированный таким образом как от перехвата, так и от активных атак, и может даже защитить вас от атак воспроизведения .
источник