暗号化

Photonは、クライアントとサーバーの間のメッセージを暗号化することができます。これは認証入力や、その他の重要なユーザーデータの送信に必須です。 その一方で、暗号化はかなりのオーバーヘッドを発生させるため慎重に使用され、PhotonのAPIではあまり使用されていません。

例:Photonのデフォルトのロジックでは、これらはルームのすべてのプレイヤーにオープンに送信て届くため、コンテンツの機密性を高めることはできません。 このため、イベントはデフォルトでは暗号化できないようになっています。

弊社のクライアントSDKは、暗号化は認証にのみ使用されます。 ディベロッパーは、メッセージごとに暗号化を使用できます。

技術的な詳細

Photon LoadBalancingまたはPUNを使用すると、APIは自動的にクライアントとサーバー間で暗号化キーを交換します。 これは、クライアントが接続した際にDiffie Hellmannキー交換によっておこなわれます。

そして、160ビットのキーはオンデマンドで AES暗号化 に使用されます。

クライアントが認証されるとサーバーはトークンを発行します。トークンとはクライアントの認証値の暗号化された要約で、他のサーバーで使用されます。トークンは、クライアントによって読みこまれる必要がありません。

トークンのリフレッシュ

設計上、Photonのトークンはマスターサーバー上でのみリフレッシュされます。 リフレッシュはマスターサーバーからゲームサーバーに切替えた場合に発生します。この切替は、ルームを作成した場合やルームに参加した場合に生じます。 トークンの有効期限は1時間ですが、ルーム内のクライアントがイベントを発生し続けた場合、トークンは特別なイベントを使用して自動的にリフレッシュされます。 しかし、クライアントが1時間以上イベントを発生させずに1つのルームにとどまった場合には、トークンはリフレッシュされず期限切れとなります。 クライアントは、問題なくゲームサーバー上にとどまることができます。 ルーム退出後にマスターサーバーに戻ろうとすると、クライアントは('Authentication token expired' Code: 32753) エラーを受信します。 解決するには、再接続をおこないます。

その他のセキュリティ上の推奨事項

カスタム認証、Webhook、またはWebRPCを使用する場合、HTTPではなくHTTPSを使用するよう留意してください。 カスタム認証では、GETではなくPOSTを使用する必要があります。 カスタム認証とWebhookまたはWebRPCを組み合わせる場合には、AuthCookieを利用することもできます。

Photon Cloudへの接続にUnityのWebGLエクスポートを使用する場合、クライアントはSecure WebSocketによって接続されます。 セルフホスティングの場合には、WSではなくWSSを推奨します。

Encryption in PUN PUNでの暗号化

PUNでは、一部のPhotonViewでRpcSecure()を呼ぶことで、安全にRPCを呼び出せます。

オペレーションの暗号化

すべてのC# APIにはPhotonPeerというクラスがあります。

これはメソッドOpCustom()を提供する低レベルのクラスです。 クライアントがおこなうすべてのオペレーションコールの基本であり、暗号化のためのパラメータがあります。

PUNでは、PhotonNetwork.networkingPeerPhotonPeerです。 LoadBalancingでは、LoadBalancingClient.loadBalancingPeerです。

必要に応じて、trueに設定した暗号化パラメータでOpCustom()を使用します。

手動で暗号化を確立

LoadBalancing APIまたはPUNを使用する場合、手動で行う必要はありません。一からクライアントを開始する場合にのみ、接続後に暗号化を確立する必要があります。

最善のケースでは、以下のようにOnStatusChangedpeer.EstablishEncryption()を呼び出します:


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

The library takes care of sending and handling the required keys. When this finishes, the client library will call OnStatusChanged with either of these codes:


    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;

 ドキュメントのトップへ戻る