暗号化
Photonは、クライアントとサーバー間で必要に応じてメッセージを暗号化できる機能で、これをペイロード暗号化と呼びます。
暗号化は一定のパフォーマンス負荷がかかるため、通常は任意であり、控えめに使用されます。
また、部屋の全員と共有できるメッセージであれば、おそらく暗号化せずに送信できるでしょう。
ユーザーIDを明示的に含むメッセージは常に暗号化されて送信されます。これには認証値も含まれます。
暗号化は常にクライアントとサーバー間で行われており、Photonはクライアント間のエンドツーエンド暗号化を提供していません。
技術的な詳細
UDP と TCP
ペイロード暗号化は、UDPおよびTCP接続においてデフォルトの設定です。必要に応じて、256ビットのキーを使用したAES暗号化が行われます。
最近のクライアントSDKは、名前サーバーへの接続にWSSを使用し、その後、UDPまたはTCPに切り替わります。こうすることで、ペイロード暗号化のための暗号化キーはTLS接続上で安全に交換されます。これは、クライアントの認証モードがAuthOnceWss
の場合に行われます。
AuthOnceWss
が使用されていない場合、クライアントがUDPまたはTCPを通じて名前サーバーに接続するときに、鍵の交換は自動的にDiffie-Hellman鍵共有によって行われます。
暗号化された操作を送信する場合、送信されるデータとすべての操作パラメータはシリアル化された後に暗号化されます。
各メッセージには(長さなどの)軽量なヘッダーが付いていますが、それは暗号化されません。
WSSトランスポートプロトコル
WSSトランスポートプロトコルを使用する場合、すべての通信(ヘッダーも含む)が暗号化されます。
そのため、その場合はペイロード暗号化を用いて個々の操作を送信するオプションは安全に無視されます。
WSSは、UnityからのすべてのWebGLエクスポートにおいて、PhotonServerSettingsのプロトコルの選択に関係なくデフォルトのプロトコルです。
Photon Voice
Photon Voiceでペイロード暗号化を使用してすべての通信を暗号化するには、Recorder.Encrypt
プロパティを使用します。このプロパティをtrueに設定したクライアントは、ストリームを暗号化して送信します。
また、WSSをトランスポートプロトコルとして使用することもできます。その場合、サーバーから個別のクライアントへのすべてのメッセージが暗号化されます。WSSはTCPに基づいており、ストリーミングにはあまり適していない場合があります(損失を取り戻すことができません)。
Photonのトークン
Photonのトークンは通常、シーンの裏側で処理されます。
クライアントAPIで見えるものではありませんが、気を付けておくべきです。
クライアントが認証されると、サーバーがクライアントの認証値の暗号化された概要であるトークンを発行し、他のサーバーで使用されるようになります。
トークンはPhoton Serverでのみ使用され他のクライアントからは読めません。
サーバー同士(クライアントを介して)でデータを共有するため、トークンデータを「インジェクト」することは可能です。
サーバープラグインはトークンから共有されたデータを読むことができます。
トークンのリフレッシュ
デフォルトでトークンの有効期限は1時間ですが、多くの場合自動的にリフレッシュされます。
リフレッシュが行われるのは2パターンです:
- ルームを作成したりルームに参加して、マスターサーバーからゲームサーバーに切替えた場合
- ルーム内のクライアントがイベントを発生し続けた場合
クライアントが1時間以上イベントを発生させずに1つのルームにとどまった場合には、トークンはリフレッシュされず期限切れとなります。
クライアントはゲームサーバーにとどまることができますが、ルームから退出する場合は、Master Serverへの接続は失敗しクライアントは再接続と再度の認証が必要となります。
C# SDK オペレーションの暗号化
すべてのC# APIにはPhotonPeer
というクラスがあります。
オペレーションを暗号化して送信するには、sendOptions.Encrypt = true
をもつPhotonPeer.SendOperation
をsendOptions
とともに呼び出します。
通常、このクラスを使用したり自分でこのメソッドを呼び出す必要はありません。低レベルで内部処理されます。
C#のAPIでは、Photonのネットワーククライアント用に高レベルのクラスを提供しています。
- PUN1では、
PhotonNetwork.networkingPeer
はPhotonPeer
です。 - Photon Realtimeでは
LoadBalancingClient.LoadBalancingPeer
がPhotonPeer
です。 - Photon Voiceでは、
LoadBalancingTransport
がLoadBalancingClient
を拡張します。 - PUN2では、
PhotonNetwork.NetworkingClient
がLoadBalancingClient
です。 - Photon Chatでは、
ChatClient.chatPeer
がPhotonPeer
です。