Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Плагины многопользовательского шифрования

Важно: UNet — это устаревшее решение, а также новая многопользовательская и сетьсистема Unity, которая обеспечивает многопользовательскую игру. игры через компьютерную сеть. Подробнее
См. в Словарь
Решение (Netcode для GameObjects) находится в разработке. Дополнительную информацию и дальнейшие действия см. на веб-сайте Unity Netcode for GameObjects.

Многопользовательская игра Unity может использовать шифрование Подключаемый модульНабор кода, созданный вне Unity, который создает функциональные возможности в Unity. . В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь
, чтобы все данные, которые вы отправляете по сети, через подключаемый модуль шифрования перед отправкой. Это позволяет защитить вашу игру от мошенничества путем манипулирования пакетами и атак на выделенные игровые серверы.

В Unity Multiplayer нет встроенного подключаемого модуля шифрования, поэтому вы должны предоставить свой собственный подключаемый модуль, реализующий алгоритм шифрования и реализующий обязательные функции, перечисленные ниже.

На следующей диаграмме показано, как многопользовательская игра Unity использует подключаемый модуль шифрования, если вы его предоставили.

Поток данных при использовании подключаемого модуля шифрования с многопользовательской игрой Unity
Поток данных при использовании подключаемого модуля шифрования с многопользовательской игрой Unity

Как использовать подключаемый модуль шифрования

Чтобы указать вашей игре или приложению использовать подключаемый модуль шифрования, вы должны вызвать UnityEngine.Networking.NetworkTransport.LoadEncryptionLibrary(path), где path — это путь к вашему скомпилированному плагину. Обычно в Windows это будет string.Format("{0}/Plugins/UnetEncryption.dll", Application.dataPath).

При вызове этой функции Unity проверяет, существует ли файл и реализуются ли в нем все обязательные функции (перечислены ниже). Это функции, которые будет вызывать сама многопользовательская система Unity. Если вы создаете собственный подключаемый модуль шифрования, вам, вероятно, потребуется добавить дополнительные функции, которые вы вызываете из кода C#. Например, чтобы инициализировать ваш алгоритм или предоставить вашему плагину значения ключей. Вы можете сделать это обычным способом для нативных подключаемых модулей, вызываемых из C#.

Примечание. Расположение плагина в собранной версии игры не обязательно совпадает с расположением в папке «Активы» и может различаться на разных целевых платформах. Возможно, вам потребуется написать код, который определяет текущую среду выполнения и выбирает правильный путь на ее основе.

Вы можете получить образец подключаемого модуля шифрования и пример проекта Unity, использующего его, на GitHub Unity. Это сделано для того, чтобы проиллюстрировать отправную точку для реализации вашего собственного подключаемого модуля.

Обязательные функции

Любой подключаемый модуль шифрования, который вы создаете или используете, должен обеспечивать следующие функции. Unity не сможет загрузить плагин, если он не определяет их. Это функции, которые будут вызываться самой средой выполнения Unity. Плагины обычно предоставляют дополнительные функции, которые можно вызывать из пользовательского кода C#, например, для регистрации ключей.

Для шифрования данных

int UNetEncryptionLib_Encrypt( void * payload, int payload_len, void * dest, int & dest_len, int connection_id, bool isConnect);

Эта функция выполняет шифрование. Это вызывается сетью Unity всякий раз, когда пакет должен быть отправлен по сети.

Параметры

  • полезная нагрузка — это данные, которые необходимо зашифровать.
  • payload_len — длина буфера payload в байтах.
  • dest — это буфер, в который подключаемый модуль должен записывать зашифрованные данные.
  • dest_len — емкость буфера назначения в байтах. Подключаемый модуль должен заменить это значение количеством байтов, фактически записанных в место назначения.
  • connection_id — это локальный идентификатор соединения.
  • isConnect имеет значение true, если этот пакет является запросом на подключение. Когда это так, плагину должно быть заранее сказано (кодом игры), какой ключ использовать. Если это значение ложно, ожидается, что подключаемый модуль уже имеет сопоставление этого значения с ключом для использования. См. пример плагина для реализации.

Возвращаемое значение

Encrypt должен возвращать ноль в случае успеха. При любом другом возвращаемом значении среда выполнения отбрасывает пакет, не отправляя его.

Для расшифровки данных

int UNetEncryptionLib_Decrypt( void * payload, int payload_len, void * dest, int & dest_len, int & key_id);

Эта функция выполняет расшифровку. Это вызывается сетью Unity всякий раз, когда пакет получен из сети.

Параметры

  • payload — это полученный пакет.
  • payload_len — длина в байтах буфера полезной нагрузки.
  • dest — это буфер, в который подключаемый модуль должен записывать расшифрованные данные.
  • dest_len — емкость буфера назначения в байтах. Подключаемый модуль должен заменить это значение количеством байтов, фактически записанных в место назначения.
  • key_id – целочисленный идентификатор. Плагин должен записать значение, которое однозначно идентифицирует используемый ключ дешифрования. На сервере это значение будет передано обратно в ConnectionIdAssigned, если будет принято новое подключение.

Возвращаемое значение

Decrypt должен возвращать ноль в случае успеха. При любом другом возвращаемом значении пакет отбрасывается без дальнейшей обработки.

SafeMaxPacketSize

unsigned short UNetEncryptionLib_SafeMaxPacketSize( unsigned short mtu);

Эту функцию следует вызвать из игры, чтобы изменить ConnectionConfig.PacketSize (также известную как максимальная единица передачи или MTU) перед вызовом < code class="mono">NetworkTransport.AddHost.

Например, ваша игра обычно использует MTU 1000 байт. Если для ConnectionConfig.PacketSize установлено значение 1000 байт перед передачей его в NetworkTransport.AddHost (через HostConfig.DefaultConfig), то уровень NetworkTransport будет отправлять не более 1000 байт открытого текста в одном пакете.

Подключаемый модуль шифрования обычно увеличивает нагрузку из-за того, что информация заголовка помещается перед полезной нагрузкой, а также округляет полезную нагрузку до размера блока шифрования. Например, если вы отправляете 18 байт открытого текста, а подключаемому модулю необходимо добавить 49 байт заголовка и использовать AES для шифрования данных с размером блока 16 байт, тогда алгоритм создаст пакет размером 81 байт (18 байт). байты открытого текста округляются до 32 байтов зашифрованного текста, а затем еще 49 байтов заголовка).

Unity вызывает эту функцию, чтобы убедиться, что пакеты, которые должны быть отправлены, не превышают предела возможной отправки, учитывая сетевой MTU и расширение и заполнение зашифрованного текста вашего алгоритма шифрования.

Параметры

  • mtu — максимальная единица передачи. Максимальный размер пакета, который должен генерировать подключаемый модуль.

Возвращаемое значение

Максимальное количество открытого текста, которое должно быть предоставлено для одного вызова Encrypt, чтобы подключаемый модуль мог генерировать пакеты, размер которых не превышает MTU.

Вы должны установить максимальный размер пакета в конфигурации подключения, чтобы указать Unity Multiplayer разделить данные, чтобы они соответствовали вашим требованиям к шифрованию. Если вы заметили, что некоторые из ваших сообщений не могут успешно передаваться по сети, это может быть связано с тем, что они были отброшены из-за превышения максимального размера пакета.

ConnectionIdAssigned

void UNetEncryptionLib_ConnectionIdAssigned( int key_id, unsigned short connection_id);

Это вызывается на сервере, когда новое соединение принято и ему присвоен идентификатор.

Параметры

  • key_id Идентификатор ключа, который был записан соответствующим предыдущим вызовом Decrypt для этого пакета.
  • connection_id Идентификатор соединения, который будет использоваться с этого момента. В частности, в качестве параметра для последующих вызовов Encrypt при отправке пакетов обратно клиенту.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3