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小時,沒有提出任何事件,令牌將不會被刷新並過期。
這不會斷開客戶端與遊戲伺服器的連接,但當它離開房間時,與主伺服器的連接將失敗,客戶端必須重新連接並再次驗証。
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;