This document is about: SERVER 4
SWITCH TO

Encryption

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

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

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

當然,您是可以控制的。

技術細節

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

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

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

WSS傳輸協議

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

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

Photon令牌

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

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

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

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

令牌刷新

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

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

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

C# SDKs

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

操作的加密

在所有的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

手動建立加密

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

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

C#

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

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

C#

    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;
Back to top