コード暗号化によるアルゴリズムの保護
独自のアルゴリズムは、多くの場合アセンブリの中で最も価値のあるものです。同時に、デコンパイラーでそのまま抜き出すのが最も簡単なものでもあります。このサンプルでは、Babel Obfuscator の NuGet パッケージを使い、MSBuild プロパティ 1 つでスコアリングエンジンに MSIL コード暗号化を適用します。これは最も単純なコード暗号化の構成で、Babel Licensing も実行時のライセンスも必要ありません。既定のコード暗号化はキーをバイナリに埋め込むため、保護されたアプリケーションは単独で動作します。
このサンプルを使用するには、Babel Obfuscator のサイトライセンス(Ultimate、Server、Data Center のいずれかのエディション)が必要です。ソースコードは GitHub で公開しています。
git clone https://github.com/babelfornet/code-encryption-nuget-example.git保護するコードは、独自のスコアリングアルゴリズム(src/AlgorithmApp/ScoringEngine.cs)です。競合他社にデコンパイラーで抜き出されたくない種類の知的財産です。
internal static class ScoringEngine
{
public static int Score(int recency, int frequency, int monetary)
{
int r = Bucket(recency, 3, 12, 30);
int f = Bucket(frequency, 2, 5, 12);
int m = Bucket(monetary, 50, 250, 1000);
return Normalize(r * 25 + f * 17 + m * 11); // vendor's secret weighting
}
// Bucket / Normalize …
}暗号化後、Score、Bucket、Normalize の本体は IL から消え、実行時に Babel Virtual Machine だけが再構築します。AlgorithmApp コンソールプロジェクトは、Release で機密性の高い型を暗号化します。
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<PackageReference Include="Babel.Obfuscator" Version="12.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<MsilEncryption>AlgorithmApp\.ScoringEngine::.*</MsilEncryption>
<BabelWarningsAsErrors>W00000</BabelWarningsAsErrors>
</PropertyGroup>MsilEncryption は、暗号化するメソッドを選択する正規表現です。ここでは ScoringEngine 型のすべてのメソッドを選択しています。Babel はこれらのメソッド本体を、Babel Virtual Machine だけが実行できる独自の暗号化された命令に書き換えます。これは既定の(<Source> を指定しない)コード暗号化であるため、Babel のライセンスが必要なのはビルド時だけで、保護されたアプリケーションは単独で動作します。
サンプルを Release でビルドすると、プログラムの出力は変わらないまま 3 つのスコアリングメソッドが暗号化され、アルゴリズムの IL はアセンブリに存在しなくなります。暗号化されたコードのロックを有効なライセンスでのみ解除できるようにし、ライセンスチェックを取り除くだけでは不十分にするには、この後に続くライセンスを使ったサンプルを参照してください。