шифрование сетевых коммуникаций в Java - PullRequest
7 голосов
/ 18 августа 2010

Мой друг и я работаем над Java Game с архитектурой клиент / сервер. Это работает хорошо, но я столкнулся с проблемой. Мы используем TCP-сокеты для взаимодействия между сервером и клиентом. Наш сетевой протокол не зашифрован и может быть прочитан только тем, кто не хочет смотреть поток.

Мы подумали о том, как можно применить к нему некоторую криптографию, чтобы скрыть информацию для входа в систему и запретить людям писать свои собственные клиенты. Но основные вещи, такие как добавление / вычитание байтов, довольно легко понять.

Какие обычные методы используются для шифрования сетевого взаимодействия для игр (или, по крайней мере, информации для входа в игру)? И, написав сервер и клиент на Java, есть ли полезные библиотеки Java?

Ответы [ 4 ]

10 голосов
/ 18 августа 2010

Используйте шифрование с открытым ключом (например, RSA) и реализуйте что-то вроде SSL Handshake или, конечно, используйте SSL - , здесь вы можете увидеть пример .

Вот упрощенная последовательность:

  • сервер отправляет свой открытый ключ RSA клиенту
  • клиент генерирует симметричный ключ (например, используя AES)
  • клиент шифрует симметричный ключ с помощью открытого ключа сервера и отправляет его на сервер
  • сервер расшифровывает полученный симметричный ключ

Теперь и клиент, и сервер имеют ключ, который никто не может подслушать. Затем используйте этот ключ для шифрования всех данных.

4 голосов
/ 18 августа 2010

SSL (уровень защищенных сокетов) популярен для решения подобных проблем.

2 голосов
/ 18 августа 2010

Посмотрите библиотеку javax.crypto или bouncyCastle.

Оба предоставляют криптографические примитивы, также для шифрования. В зависимости от того, насколько безопасным вы хотите его иметь, вы можете использовать симметричную или ассиметричную криптографию. Тем не менее, также подумайте об управлении ключами заранее. Где вы храните свой закрытый / общий ключ.

Если это клиент-сервер, лучшим способом было бы использовать ассиметричное шифрование (например, RSA, Elliptic Curve) и дать каждому пользователю сертификат, подписанный ключом сервера (обратите внимание, это TLS (ранее назывался SSL). )). Таким образом, вы можете проверить подлинность входа пользователя. Однако вы не запрещаете настраиваемые клиенты, так как пользователь должен, чтобы каждый мог просто скопировать сертификат.

На практике довольно сложно предотвратить создание пользовательских клиентов.

0 голосов
/ 18 августа 2010

Вы можете использовать Шифры . Еще несколько примеров здесь и здесь

...