Skip to Content
Nuova versione 12 disponibile 🎉
LicensingCodice cifrato esterno

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.git

ReportTool è 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.dll

Le quattro combinazioni rendono evidente il controllo a due fattori:

Licenzapremium.eil consegnatoRisultato
StandardnoPremium bloccata
PremiumnoPremium bloccata: funzionalitĂ  non consegnata
StandardsìPremium bloccata: non concessa in licenza
Premiumsì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.

Last updated on