このセクションでは強力にネーミングされたアセンブリを作成して使用して、Javascript と連携させ自身のカスタムバックエンドと連動する方法を、学びます。
信頼の連鎖は外部のインターネットアプリケーションを許可して、Unity Web Player から生成されたリクエストを信頼します。これは完全な機能を持った API を Unity Web Player でゲームを作成する Unity 開発者に提供したい場合は便利です。信頼の連鎖を使用するためにリクエストを受付するバックエンドのインターネットアプリケーションが必要であり、もっとも一般的な例は REST API を使用した Web アプリケーションです。インターネットアプリケーションをコールするためのマネージド C# アセンブリのコードを保有している必要があります。
信頼の連鎖を確立する最初のステップはアセンブリを署名するのに必要な暗号化されたキーペアを作成することです。この作業は Windows、OS X や Linux 上で SN ツールを使用して行います。
新しいキーペアを作成するにはコマンドラインを開き、次のとおりに入力します。
sn -k myNewKey.snk
myNewKey.snk
を、自身が適切と考える名前で置き換えます。ファイル名は信頼の連鎖の観点では何でもかまいません。
.SNK ファイルを保持します。このファイルが漏洩したり、悪意のある開発者であればアセンブリを解析する可能性があります。
次に生成したキーペアを使用して自身のマネージド C# アセンブリ(バックエンドの呼び出しに使用するもの)を署名します。Windows、OS X や Linux に含まれる al
ツールを使用する必要があります。
アセンブリの署名は簡単なプロセスです。
コマンドラインターミナルを開き、マネージド C# アセンブリへと移動し、次のとおりに入力します。
al /out:mySignedAssembly.dll myUnsignedAssembly.dll /keyfile:myNewSky.snk
mySignedAssembly.dll
は希望する自身の最終的なアセンブリ名です。
myUnsignedAssembly.dll
は自身の通常の、署名していないマネージド C# アセンブリです。
myNewKey.snk
は自身の暗号化されたキーペアファイルです。
al
が一回実行完了すると、自身の署名されたアセンブリは準備完了となります。Unity プロジェクト上にドロップして信頼の連鎖に使用します。
Unity Web Player には Unity ゲームが読み込まれた後にいつでも秘密事項をインジェクトできます。これは Javascript オブジェクトの UnityObject2
で公開されている Javascript の SendMessage により実現できます。
特定のゲームオブジェクトに特有の形式のメッセージを渡すとき信頼の連鎖は秘密事項をインジェクトしたいことを検知してメッセージをインターセプトします。このシステムを使用するのにゲームオブジェクトをリネームする必要はまったくありません。u
と呼ばれる UnityObject2
インスタンスによる Javascript コールは。
u.GetUnity().SendMessage("ChainOfTrust_SetValueASDF", ".", "name=mySecretDataName;value=mySecretValue;publickey=publicKeyTokenOfMyAssembly");
* 対象となるゲームオブジェクト名
* 実行するメソッド名
* String の引数
信頼の連鎖によりメソッドの名前は完全に無視されます。ターゲットゲームオブジェクトの名前は ChainOfTrust _SetValue
で始める必要があり、しかしながら ChainOfTrust_ SetValue
の後に記述した文字列は安全に無視できます。
=
) が必須です。秘密事項には任意の name
を適用できます。先の例では mySecretDataName
を上記サンプル上で置き換えます。
value
は共有鍵や信頼の連鎖に格納する他の秘密事項です。具体的にこの値に何を格納するかは固有のアプリケーションに特有です。先の例では mySecretDataValue
を上記サンプル上で置き換えます。
publickey
はマネージド C# アセンブリを署名した公開鍵のトークンです。sn
ツールを使用して、署名したアセンブリ上で見つけることができます。
sn -T mySignedAssembly.dll
公開鍵のトークンを前後に空白スペースなしに複製し、先の例では myPublicKeyToken
を上記サンプル上で置き換えます。
Unity Web Player に秘密事項をインジェクトした後は、暗号化署名された (“強い名前の”) マネージド C# アセンブリをマッチングふる公開鍵のトークンによってのみ受け取ることができます。
マネージド C# アセンブリは Security.GetChainOfTrustValue をコールして秘密事項を受け取る必要があります。GetChainOfTrustValue では、payload の name=
構文で、秘密事項の名前を渡す必要があります。
GetChainOfTrustValue は秘密事項の値をクリアテキストとして戻し、アセンブリの中でそれを使用することができます。
インジェクション payload において name=mySecret;value=superSecretData;publickey=A92181sn828O
とすると、マネージド C# アセンブリの中で秘密事項を受け取るコードは。
string myValue = Security.GetChainOfTrustValue(“mySecret”);
秘密事項の値をセキュアにするために多くの苦労をしているため、秘密事項の値はマネージド C# アセンブリの外にあるなんらかの関数やコードに渡すべきではありません。
署名されてないコードから Security.GetChainOfTrustValue をコールするための試行や署名されたアセンブリでシグニチャが秘密事項の指定された公開鍵とマッチングしないコードからの試行は、ログ上でエラーが記録されて、Security.GetChainOfTrustValue は空白の文字列を戻します。
SendMessage 関数は標準的な MonoBehaviour/SendMessage 関数と似通っている。3 つの名目の引数をとる。