パスワードで保護されたコード
場合によっては、暗号化されたコードを外部ファイルに保存するよりも、難読化されたアセンブリの中に保持するほうが望ましいことがあります。この場合、暗号化されたコードへのアクセスはパスワードで保護されます。これにより、同じレベルのセキュリティを維持しながら、メソッドの再構築に必要な情報の量を大幅に減らせます。パスワードがなければ、Babel Virtual Machine(BVM)は元のメソッドを再構築できず、暗号化されたコードは役に立ちません。暗号化されたコードはアセンブリ内に保存され、必要なときにすばやくアクセスできるため、この方法はセキュリティとパフォーマンスのバランスが取れています。
パスワードで暗号化するコードを定義するには、暗号化するメソッドまたは型、ソース名、使用するパスワードを指定する XML ルールが必要です。そのようなルールの例を次に示します。
<Rule name="encrypt algorithms" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>ACME.Algorithms::*</Pattern>
<Properties>
<Source>algorithms</Source>
<Password>mySecretPassword</Password>
<Internal>true</Internal>
</Properties>
<Description>Encrypt code in the Algorithms class using a password.</Description>
</Rule>このルールには、true に設定された Internal プロパティが含まれていることに注意してください。これは、暗号化されたコードを外部ファイルではなく、難読化されたアセンブリの中に保存するよう Babel に指示するものです。
暗号化されたコードは難読化されたアセンブリの中に保存されるため、暗号化されたストリームを取得する GetSourceStream メソッドを定義する必要はありません。代わりに、メソッドの復号と実行に必要なパスワードを取得するために BVM が呼び出す、別のメソッドを宣言する必要があります。
[Obfuscation(Feature="msil encryption get password")]
internal static string GetSourcePassword(string source) 実行時に、BVM は、暗号化されたメソッドに関連付けられた暗号化データソースの名前(この場合は「algorithms」)を渡して GetSourcePassword を呼び出します。GetSourcePassword メソッドは、要求されたデータソースのバイトコードを復号するためのパスワードを返す必要があります。これで、BVM は要求されたメソッドを実行できます。
このフックは、固定のパスワードを返す代わりに、顧客のライセンスから読み取った値を返すこともできます。その場合、保護された機能のロックは、ライセンスを持つユーザーに対してだけ解除されます。ライセンスに紐付けたコード暗号化を参照してください。