ライセンスに紐付けたコード暗号化
このサンプルでは、Babel の 2 つの技術を組み合わせて、保護された機能を有効なライセンスに暗号学的に依存させます。MSIL コード暗号化が機密性の高いメソッドの本体を暗号化し、Babel Licensing が復号用のパスワードを、それ自体も暗号化したうえで、署名され、ハードウェアに紐付けたライセンスの中に格納します。Babel Virtual Machine は「get password」フックを通じてアプリケーションにパスワードを要求し、フックはライセンスの検証が成功した後にだけパスワードを返します。ライセンスチェックを取り除いたり回避したりするだけでは不十分です。有効なライセンスがなければパスワードはなく、パスワードがなければ暗号化されたコードは実行できません。
このサンプルを使用するには、Babel Obfuscator のサイトライセンス(Ultimate、Server、Data Center のいずれかのエディション)と Babel Licensing が必要です。ソースコードは GitHub で公開しています。
git clone https://github.com/babelfornet/license-bound-encryption-console-example.git機密性の高いメソッドには、Babel が暗号化された本体をアセンブリ内に保持し、実行時にパスワードを要求するようにマークを付けます。
[Obfuscation(Feature = "msil encryption:internal=true;source=core;password=...")]
public static int Compute(int a, int b) { /* protected body */ }
[Obfuscation(Feature = "msil encryption get password")]
internal static string GetSourcePassword(string source)
{
// Validate the license and return the password only when it is valid.
}コードのパスワードが、配布するバイナリに平文で現れることはありません。パスワードは(ベンダーのシークレットで暗号化して)ライセンスのフィールドに書き込まれ、実行時には、正しく署名され現在のコンピューターに紐付けられたライセンスからのみ取り出されます。付属の LicenseGenerator プロジェクトがライセンスを生成します。
Valid license -> Compute(7, 5) = 147 (the encrypted method runs)
Missing / tampered -> Protected computation blocked (the BVM cannot decrypt the method)これは、Babel 自身の機能制御にも使われている方式です。詳しい説明はコード暗号化のマニュアルのライセンスに紐付けたコード暗号化を、複数の機能を扱う例は機能ベースのライセンスを参照してください。