機能ベースのライセンス
Babel Obfuscator にはライセンス管理の機能があり、難読化されたコード向けに機能ベースのライセンスを生成できます。つまり、提供されたライセンスキーに応じて、アプリケーション内の特定の機能のロックを解除するライセンスを作成できます。
これを実装する方法の 1 つは、コード暗号化を Babel Licensing と組み合わせて使うことです。Babel Obfuscator でコードを暗号化し、コードの暗号化された特定の部分のロックを解除するライセンスキーを生成できます。こうすることで、ユーザーのニーズに応じて、異なるライセンスレベルや機能セットを提供できます。
たとえば、Standard、Professional、Enterprise という 3 つの機能レベルを持つアプリケーションがあるとします。Babel Obfuscator でアプリケーションの Enterprise の機能を暗号化し、それらの機能のロックを解除するライセンスキーを生成できます。そのうえで、サブスクリプションのレベルに応じて異なるライセンスキーをユーザーに提供し、それぞれのキーで対応する機能セットのロックを解除します。
これを実装するには、Babel Licensing を使ってライセンスキーを生成し、実行時に検証します。ユーザーがライセンスキーを入力すると、アプリケーションは Babel Licensing でキーを検証し、どの機能のロックを解除するかを判断します。その後、コードの暗号化された部分が復号され、ユーザーが利用できるようになります。
コード暗号化を使った機能ベースのライセンスを示すサンプルのソースコードは、GitHub で公開しています。
git clone https://github.com/babelfornet/license-features-example.gitこのサンプルは、Babel Licensing の NuGet パッケージを参照して、その機能を使用します。サンプルコードには LicenseManager クラスの実装が含まれており、このクラスはライセンスの有効性と特定の機能の有無を確認するメソッドを提供します。
public ILicense ValidateLicense()
{
// To validate the license, only the public key is required.
// The private key is only used to sign the license, and in production the private key
// should not be distributed with the application.
// The public key should be distributed with the application and used to validate the license.
// The following signature provider can be used to create and validate the license
// as includes both the private key and the public key.
var signature = CreateSignature();
// The public key string can be embedded into the application and used to create a signature
// provider used only to validate the license.
string publicKey = signature.ExportKeys(publicKeyOnly: true);
// To create the RSASignature from the public key use the following code
var validatingSignature = RSASignature.FromKeys(publicKey);
// And assign the validating signature provider to the license manager
var licenseManager = new XmlLicenseManager();
licenseManager.SignatureProvider = validatingSignature;
license = licenseManager.Validate(File.ReadAllText(LicenseFileName), typeof(LicenseManager), this);
return license;
}サンプルには、有効期限、ライセンスされた機能、製品情報などのライセンス情報を指定した XML ライセンスファイルを生成するコードも含まれています。
サンプルに含まれるライセンス生成用のコードはデモ専用であり、本番環境に含めてはなりません。
コード暗号化を使うと、ソフトウェアアプリケーションの機能を構成するコードが、適切なライセンスファイルなしで使用されないように保護できます。そのためには、特定の機能を実装するコードを暗号化し、そのコードの復号と実行にパスワードを要求します。
[Obfuscation(Feature = "msil encryption:internal=true;source=feature1;cache=false;password=aR&tj4i7u@", Exclude = false)]
internal class Feature1
{
public Feature1() { }
public string DoTask()
{
return "Feature1: " + Add(7, 8);
}
public int Add(int a, int b) => a + b;
}パスワードは、ユーザーがライセンスを取得した機能に基づいて生成されたライセンスファイルから取得できます。
Babel Obfuscator は Obfuscation 属性を使って、保護する機能を構成するコードをマークし、保護されたコードの復号と実行に必要なパスワードを取得するために実行時に呼び出すメソッドを指定します。このメソッドは通常、ライセンスファイルまたはライセンスサーバーからパスワードを取得する小さな関数です。Babel Obfuscator は実行時にこのパスワードを使って保護されたコードを復号するため、ライセンスを持つユーザーだけがその機能を利用できます。
[Obfuscation(Feature = "msil encryption get password")]
internal static string GetSourcePassword(string source)
{
var lm = LicenseManager.Instance;
var feature = lm.License.Features.FirstOrDefault(item => item.Name == source);
if (feature == null)
throw new ApplicationException(source + " not found");
return Encoding.UTF8.GetString(feature.Data);
}サンプルをコンパイルしたら、難読化プロジェクト「Obfuscate.babel」を Babel Desktop で実行するか、コマンドラインから babel --project Obfuscate.babel で実行して、アプリケーションの機能をコード暗号化で保護します。
難読化の統計には、feature1 などの機能のソースごとに、暗号化されたメソッドが報告されます。Babel Desktop では、コード暗号化の統計に、暗号化されたすべてのメソッドがそのソースとともに一覧表示されます。
保護されたアプリケーションを起動し、用意されている 3 つのアプリケーションエディション(Standard、Professional、Enterprise)のライセンスを生成できます。エディションが上がるごとにロックが解除される機能が増えるため、上位のエディションのライセンスほど、アプリケーションで使える機能が多くなります。したがって、Enterprise エディションのライセンスを生成するとすべての機能のロックが解除され、Standard エディションのライセンスを生成すると一部の機能だけロックが解除されます。

ライセンスされた機能
LicenseManager クラスは、有効なライセンスがあるかどうかと、要求された機能が含まれているかどうかを確認します。ライセンスが有効で、機能が有効になっていれば、アプリケーションはユーザーにその機能の利用を許可します。
このように、コード暗号化を Babel Licensing と組み合わせると、コードをリバースエンジニアリングや不正コピーから保護しながら、柔軟で機能の豊富なアプリケーションを作成できます。