FunzionalitĂ come file cifrato esterno
Distribuisci una funzionalità premium come codice cifrato che risiede fuori dall’applicazione e viene sbloccato solo quando il cliente possiede anche una licenza che la concede.
Babel Obfuscator può estrarre il corpo cifrato di un metodo in un file binario separato con
estensione .eil invece di incorporarlo nell’assembly (vedi
File di codice esterni). Quel file può essere
distribuito in modo indipendente, per esempio consegnato insieme a una licenza nel momento in cui un
cliente passa a un’edizione superiore. Questo esempio combina le due cose: il codice premium è un file
.eil esterno, e per eseguirlo servono sia il file sia una licenza Babel valida che concede la funzionalitĂ .
Esempio di codice
git clone https://github.com/babelfornet/external-encrypted-code-console-example.gitReportTool è un’applicazione console con un report Standard gratuito e un’analisi Premium. Il
codice Premium è cifrato in premium.eil; LicenseGenerator emette una licenza Standard oppure
una licenza Premium.
Cifratura esterna
Il metodo premium imposta source ma non internal, quindi Babel scrive il suo corpo cifrato
in un file esterno premium.eil:
[Obfuscation(Feature = "msil encryption:source=premium;password=Pr3m!um-R3port-K3y", Exclude = false)]
public static string Analyze(int[] data)
{
double mean = data.Average();
double variance = data.Select(x => (x - mean) * (x - mean)).Sum() / data.Length;
return $"Premium analysis: mean={mean:0.00}, variance={variance:0.00}, stddev={Math.Sqrt(variance):0.00}";
}Babel genera premium.eil accanto all’assembly intermedio. Un breve target MSBuild lo copia nella
cartella di output, così può essere distribuito con l’applicazione oppure trattenuto di proposito:
<Target Name="CopyBabelExternalFiles" AfterTargets="Build">
<ItemGroup>
<BabelEilFiles Include="$(IntermediateOutputPath)*.eil" />
</ItemGroup>
<Copy SourceFiles="@(BabelEilFiles)" DestinationFolder="$(OutDir)"
SkipUnchangedFiles="false" Condition="'@(BabelEilFiles)' != ''" />
</Target>Due hook subordinati alla licenza
Per il codice esterno la BVM chiama due hook: uno per ottenere il flusso cifrato e uno per la password. Questo esempio subordina entrambi a una licenza valida, quindi non bastano né il solo file né la sola licenza:
// Returns the .eil stream only when a valid license grants the feature.
[Obfuscation(Feature = "msil encryption get stream")]
internal static Stream? GetSourceStream(string source)
{
if (!HasFeature(source))
return null; // Not licensed for this feature.
var path = Path.Combine(FeaturesDirectory, source + ".eil");
return File.Exists(path) ? File.OpenRead(path) : null; // Feature file not delivered.
}
// Returns the password carried by the license.
[Obfuscation(Feature = "msil encryption get password")]
internal static string GetSourcePassword(string source)
{
var license = Validate();
var field = license.Fields.FirstOrDefault(f => f.Name == source)
?? throw new InvalidOperationException($"License does not grant source '{source}'.");
return field.Value.Decrypt(Secrets.FieldSecret);
}HasFeature restituisce true solo quando la licenza convalidata contiene un campo con il nome
della funzionalitĂ , che il generatore aggiunge per una licenza Premium:
if (premium)
{
string encrypted = Secrets.PremiumPassword.Encrypt(Secrets.FieldSecret);
builder = builder.WithField(Secrets.PremiumSource, encrypted);
}Eseguire l’esempio
# Build in Release — Babel encrypts Premium.Analyze into premium.eil.
dotnet build src/ReportTool/ReportTool.csproj -c Release
# Mint a Premium license (add --standard for a Standard one).
dotnet run --project src/LicenseGenerator
# Deliver BOTH the license and the external code, then run.
cp ReportTool.lic src/ReportTool/bin/Release/net8.0/
dotnet src/ReportTool/bin/Release/net8.0/ReportTool.dllLe quattro combinazioni rendono evidente il controllo a due fattori:
| Licenza | premium.eil consegnato | Risultato |
|---|---|---|
| Standard | no | Premium bloccata |
| Premium | no | Premium bloccata: funzionalitĂ non consegnata |
| Standard | sì | Premium bloccata: non concessa in licenza |
| Premium | sì | L’analisi Premium viene eseguita |
Quando manca uno dei due fattori, la BVM segnala no code source premium stream e il report
Standard continua a funzionare da solo.
Distribuire il codice protetto come file separato si adatta bene alle licenze basate sulle
funzionalità e ai componenti aggiuntivi: l’applicazione di base è un solo download, e ogni
funzionalità a pagamento è un piccolo file .eil fornito insieme alla licenza che lo sblocca. Per
revocare una funzionalitĂ , al produttore basta non rinnovare la licenza che la concede.
keys.pem e le password dell’esempio hanno solo scopo dimostrativo. In produzione la licenza
è emessa dal produttore o dal Babel Licensing Service,
e la chiave privata RSA è conservata offline.