PUN Classic (also called PUN1) is the original and first major version of PUN. It is now replaced by PUN2 which is refactored and enhanced. We highly recommend starting new projects with PUN2 and if possible migrating existing ones from PUN1 to PUN2 by following our "Migration Notes". PUN Classic will be maintained for the coming months. We will fix important bugs and support new Unity versions but new features will be added only to PUN2.

Encryption

Photon可以讓您根據需要對客戶端和伺服器之間的信息進行加密。 這個規則的例外是認証數據,它總是被加密發送。

加密是可選的,而且很少使用,因為它需要一些性能。 如果一個消息可以與房間裡的每個人共享,它可能也可以在不加密的情況下被發送。

當使用時,加密總是在客戶端和伺服器之間進行。 Photon不提供客戶端之間的端對端加密。

當然,您是可以控制的。

技術細節

當您使用UDP或TCP作為傳輸協議時,Photon客戶端將自動與伺服器交換加密密鑰。 這是在客戶端連接時通過Diffie-Hellman Key Exchange完成的。

然後,256位的密鑰會根據需要用於AES encryption

如果一個操作被加密發送,您發送的任何數據和所有操作參數都被序列化,然後被加密。 每條信息的精簡標題(長度等)保持不加密。

Back To Top

WSS傳輸協議

如果您使用Unity的WebGL導出連接到Photon Cloud,客戶端將通過安全WebSockets連接。 我們建議在自主持時也使用WSS而不是WS。

當使用WSS傳輸協議時,所有的通信都會像您所期望的被加密,包括標頭信息。 在這種情況下,Photon客戶端不會交換加密密鑰,也不會按要求應用AES。

Back To Top

PUN中的加密

在PUN中,您可以按需發送帶有加密功能的RPC和事件。 對於網絡對象的頻繁和定期更新,是不加密的。

要以安全的方式調用RPC,請在任何PhotonView上使用RpcSecure()

PhotonNetwork.RaiseEvent()可以用來發送有或沒有加密的自定義事件。

在這兩種情況下,伺服器都會解密信息並重新加密,然後發送給其他玩家。 一個伺服器插件可以利用這些數據,讀取或改變它。

Back To Top

Photon令牌

Photon的Token通常是在幕後處理的。 它在客戶端API中不是很明顯,但意識到這一點是有意義的。

一旦客戶端通過了認証,伺服器就會發出一個Token,這是一個加密的客戶端認証值的摘要,可以在其他伺服器上使用。

Token只在Photon伺服器上使用,客戶無法讀取。

可以 "插入 "一些數據到令牌中,在伺服器之間共享(通過客戶端)。 一個伺服器插件可以從令牌中讀取這些共享數據。

Back To Top

令牌刷新

默認情況下,Photon令牌在1小時後過期,但在大多數情況下,它們會自動為客戶端刷新。 刷新發生在兩種情況下:

  1. 從主伺服器切換到遊戲伺服器時,如果您創建或加入一個房間。
  2. 只要客戶端在房間裡不斷地引發事件。

如果客戶端在房間內停留超過1小時,沒有提出任何事件,令牌將不會被刷新並過期。 這不會斷開客戶端與遊戲伺服器的連接,但當它離開房間時,與主伺服器的連接將失敗,客戶端必須重新連接並再次驗証。

Back To Top

C# SDKs

在這個頁面中,我們只提到了C#客戶端SDK。 同樣的功能在其他SDK中也應該有。

Back To Top

操作的加密

在所有的C#客戶端SDK中,我們有一個叫做 "PhotonPeer "的類別。 要發送一個加密的操作,需要調用PhotonPeer.SendOperation,其參數為sendOptions.Encrypt = true

但通常您不需要使用該類或自己調用該方法。 它是在內部較基層中完成。 在C# APIs中,我們為Photon網絡客戶端提供了進階類別。

  • 在PUN1中,PhotonNetwork.networkingPeer是一個PhotonPeer
  • 在Photon Realtime中,LoadBalancingClient.LoadBalancingPeer是一個PhotonPeer
  • 在Photon Voice中,LoadBalancingTransport擴展了LoadBalancingClient
  • 在PUN2中,PhotonNetwork.NetworkingClient是一個LoadBalancingClient
  • 在Photon Chat中,ChatClient.chatPeer是一個PhotonPeer

Back To Top

手動建立加密

在我們的客戶端SDK中,您不需要手動操作。 只有當您從頭開始您的客戶端(只引用資料庫),您必須在連接後建立加密。

在最好的情況下,在OnStatusChanged中調用PhotonPeer.EstablishmentEncryption(),類似:

    public void OnStatusChanged(StatusCode returnCode)
    {
        // handle returnCodes for connect, disconnect and errors (non-operations)
        switch (returnCode)
        {
            case StatusCode.Connect:
                this.peer.EstablishEncryption();
                // ...

該資料庫負責發送和處理所需的密鑰。 當這一切完成後,客戶端庫將調用OnStatusChanged,並使用這些代碼中的一個:

    public void OnStatusChanged(StatusCode returnCode)
    {
        // handle returnCodes for connect, disconnect and errors (non-operations)
        switch (returnCode)
        {
            // ...

            case StatusCode.EncryptionEstablished:
                // encryption is now available
                // this is used per operation call
                break;
            case StatusCode.EncryptionFailedToEstablish:
                // if this happens, get in contact with Exit Games
                break;


To Document Top