整合性に連動する暗号化 Ultimate
整合性に連動する暗号化は、Babel に組み込まれた文字列暗号化とコード(MSIL)暗号化を、Babel が生成したアセンブリファイルそのものに紐付けます。この方式で暗号化された文字列やメソッドは、改変されていないそのファイルからアプリケーションが実行されている場合にだけ正しく復号されます。パッチが当てられたバイナリ、16 進エディターで 1 バイトを書き換えたファイル、別のビルドとマージされたファイルなど、ほかのコピーでは復号に失敗し、保護された文字列やメソッドは正しい値に戻りません。
この機能がない場合、文字列暗号化と MSIL 暗号化は、隠している内容を保護しますが、復号ルーチン自体はどのファイルに置かれても同じように動作します。つまり、アセンブリから取り出したメソッドや文字列を別のアセンブリに移しても、そこで問題なく復号できてしまいます。整合性に連動する暗号化は、復号を出荷されたファイルそのものに結び付けることでこのギャップを解消します。保護されたデータをほかの場所に移した時点でそれだけで機能しなくなるため、検出用のコードを自分で書いたり保守したりする必要はありません。
整合性に連動する暗号化は、改ざん検出とは別の保護手段です。改ざん検出は反応型です。読み込まれたイメージを検証し、一致しなかった場合にログの記録、メッセージの表示、終了といった独自のコードを実行させられます。これに対して整合性に連動する暗号化はまったく反応しません。暗号化されたデータを、そのために作られたファイルの外では使えないようにするだけです。この 2 つは組み合わせて使うのに向いています。目に見える対応は改ざん検出で行い、整合性に連動する暗号化によって、対応すら不要なほど復元できないようにします。

Babel Desktop のターゲットプロパティでは、整合性に連動する暗号化は文字列暗号化と MSIL 暗号化の隣にあります
要件
- ターゲットで文字列暗号化またはコード暗号化があらかじめ有効になっている必要があります。整合性に連動する暗号化には保護すべき対象が単独では存在せず、有効にしている文字列暗号化と MSIL 暗号化のうち、どちらか(または両方)の復号を紐付けるだけです。どちらも有効でない状態でこの機能を有効にしても何も起こりません。
- デスクトップの .NET Framework 4 以降、または .NET/Core のアセンブリに限られます。ファイルとして存在し、読み込み可能な PE イメージであることが前提です。単一ファイルでの公開、トリミング、NativeAOT では利用できません。これらの公開方式では、アセンブリが Babel が紐付けられる単純なファイルのままでは残らないためです。
- アセンブリに厳密名は必須ではありません。すでに厳密名が付いている場合は、同じチェックの中で Babel が厳密名の署名も検証します。
- Obfuscator Ultimate エディションに加えて、Obfuscator Ultimate を含む Babel Licensing の Server エディションと Data Center エディションにも含まれています。
整合性に連動する暗号化の有効化
コマンドライン
babel myapp.exe --integrityencryption --stringencryption trueMSBuild の Babel タスク
<PropertyGroup>
<IntegrityEncryption>true</IntegrityEncryption>
<StringEncryption>true</StringEncryption>
</PropertyGroup>
<Babel IntegrityEncryption="$(IntegrityEncryption)" StringEncryption="$(StringEncryption)" />Babel Desktop
ターゲットのオプション一覧で、文字列暗号化または MSIL 暗号化の隣にある整合性に連動する暗号化をオンにします。どちらの暗号化もまだ有効でない場合、Babel Desktop はこの設定にフラグを立てます。紐付ける対象が存在しないためです。

この設定のヘルプテキストには、要件とエディションが改めて記載されています
例
機密性の高い名前空間を MSIL 暗号化であらかじめ暗号化しているターゲットに、それを紐付けるための整合性に連動する暗号化を追加した例です。
<PropertyGroup>
<MsilEncryption>true</MsilEncryption>
<IntegrityEncryption>true</IntegrityEncryption>
</PropertyGroup>
<Babel MsilEncryption="$(MsilEncryption)" IntegrityEncryption="$(IntegrityEncryption)">
<XmlRules>
<Rules>
<Rule name="encrypt-licensing" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>ACME.Licensing.*::*</Pattern>
</Rule>
</Rules>
</XmlRules>
</Babel>このルールは、MSIL 暗号化が保護するメソッドを選びます。整合性に連動する暗号化は、この選択を変更するものではなく、その結果をこのビルドの出力ファイルに結び付けるだけです。メソッドの選択方法は、整合性に連動する暗号化があってもなくても同じです。MsilEncryption 自体に指定する正規表現やワイルドカードのフィルター、または上記のような feature="msil encryption" を指定した XML ルールのいずれかを使います。フィルターにも一致するルールにも何も指定しない場合、MsilEncryption は機能を有効にするだけで何も選択しないため、整合性に連動する暗号化にも紐付ける対象がなくなります。
留意点
- この機能は加算的です。有効にしても、どの文字列やメソッドが暗号化されるかは変わらず、それらの復号が出荷されたファイルにどう結び付けられるかだけが変わります。
- 単一ファイル/トリミング/AOT の制限によって改ざん検出が機能しないビルドでは、同じ理由で整合性に連動する暗号化も適用されません。どちらの機能も、アセンブリが読み込み可能な単純なファイルであることを必要とするためです。
- 難読化の後でアセンブリをリビルドしたり、再署名したり、再マージしたりすると、改ざん検出のハッシュが無効になるのと同じように、この紐付けも無効になります。整合性に連動する暗号化は、出荷するファイルを生成する Babel のビルド手順の一部として適用してください。後続の手順でファイルが変更される前に適用しないでください。
関連項目
- 文字列暗号化とコード(MSIL)暗号化:整合性に連動する暗号化が紐付ける 2 つの保護機能です。
- 改ざん検出:この機能とうまく組み合わせられる、反応型の保護機能です。
- XML ルール:
feature="msil encryption"を使って、MSIL 暗号化が保護するメソッドを選択します。