Abonnementlizenz mit verschlüsseltem Pro-Code
Eine zeitlich begrenzte Abonnementlizenz mit Kulanzfrist, bei der der Code, der dem Abonnement vorbehalten ist, mit der Codeverschlüsselung von Babel Obfuscator geschützt wird.
Abonnements brauchen zwei Verhaltensweisen, die ein einfaches Ablaufdatum nicht bietet: eine Kulanzfrist, damit zahlende Kunden nicht in dem Augenblick ausgesperrt werden, in dem sich eine Verlängerung verspätet, und eine Durchsetzung, die sich nicht durch das Bearbeiten einer Konfigurationsdatei umgehen lässt. Dieses Beispiel leistet beides und bindet die Premium-Funktionen („Pro“) mit der Codeverschlüsselung an das Abonnement: Die Pro-Methode läuft nur, solange das Abonnement einschließlich seiner Kulanzfrist gültig ist, weil die Babel Virtual Machine ihr Passwort für die Entschlüsselung aus der Lizenz erhält.
Codebeispiel
git clone https://github.com/babelfornet/subscription-license-console-example.gitProSuite ist eine Konsolenanwendung mit einer kostenlosen Basisfunktion und einer verschlüsselten Pro-Funktion.
LicenseGenerator stellt Abonnementlizenzen mit einstellbarer Laufzeit und Kulanzfrist aus.
Zwei Datumsangaben: Verlängerung und endgültiger Stichtag
Die Lizenz enthält zwei Datumsangaben:
- das von der Engine durchgesetzte
ExpireDate, das auf das Ende der Kulanzfrist gesetzt ist (der endgültige Stichtag), und - ein weiches Feld
subscription-end, das angibt, wann die Verlängerung fällig ist.
DateTime subscriptionEnd = now.AddDays(days); // soft end — renewal due
DateTime hardCutoff = subscriptionEnd.AddDays(grace); // engine-enforced end of grace
var license = new StringLicense { ExpireDate = hardCutoff };
license
.ForAssembly(assemblyFullName)
.WithUniqueId("SUBSCR-")
.WithHardwareKey(HardwareId.Create().ToMachineKey())
.WithField(Secrets.SubscriptionEndField, subscriptionEnd.ToString("O"))
.WithField(Secrets.ProSource, Secrets.ProPassword.Encrypt(Secrets.FieldSecret))
.LicensedTo("Demo Customer", "demo@example.com", "ACME Corp");Babel Licensing weist die Lizenz automatisch zurück, sobald ExpireDate überschritten ist. Der endgültige
Stichtag braucht daher keinen eigenen Code. Die Anwendung muss nur aktiv von in der
Kulanzfrist unterscheiden, und dazu vergleicht sie das weiche Feld subscription-end mit der aktuellen Zeit:
var now = DateTime.UtcNow;
if (subEnd.HasValue && now > subEnd.Value)
{
int graceDaysLeft = (int)Math.Ceiling(((license.ExpireDate ?? now) - now).TotalDays);
return new SubscriptionStatus(SubscriptionState.Grace, subEnd, graceDaysLeft,
$"Subscription lapsed — grace period active ({graceDaysLeft} day(s) left). Please renew.");
}Die verschlüsselte Pro-Funktion
Die Pro-Methode ist verschlüsselt. Ihr Passwort kommt über den Hook get password
aus der Lizenz. Das bindet den verschlüsselten Code an das Abonnement: Solange die Lizenz die Validierung besteht
(aktiv oder in der Kulanzfrist), gibt der Hook das Passwort zurück, und die Methode läuft. Ist der endgültige Stichtag
überschritten, löst Validate() eine Ausnahme aus, und der Hook kann das Passwort nicht mehr liefern.
[Obfuscation(Feature = "msil encryption:internal=true;source=pro;password=Pr0-Su1te-2026-K3y", Exclude = false)]
public static string Forecast(double[] series) { /* premium analytics */ }
[Obfuscation(Feature = "msil encryption get password")]
internal static string GetSourcePassword(string source)
{
var license = Validate(); // throws once past the end of grace
var field = license.Fields.FirstOrDefault(f => f.Name == source)
?? throw new InvalidOperationException($"License does not grant source '{source}'.");
return field.Value.Decrypt(Secrets.FieldSecret);
}Ausführen
# Build in Release — Babel encrypts Pro.Forecast.
dotnet build src/ProSuite/ProSuite.csproj -c Release
# Mint a subscription license: active for 30 days, 7-day grace.
dotnet run --project src/LicenseGenerator -- --days 30 --grace 7
cp ProSuite.lic src/ProSuite/bin/Release/net8.0/
dotnet src/ProSuite/bin/Release/net8.0/ProSuite.dllStellen Sie die Lizenz neu aus, um jeden Zustand durchzugehen:
dotnet run --project src/LicenseGenerator -- --days -2 --grace 7 # lapsed, in grace
dotnet run --project src/LicenseGenerator -- --expired # past grace| Zustand | Bedingung | Pro-Funktion |
|---|---|---|
| Aktiv | vor dem Ende des Abonnements | läuft |
| Kulanzfrist | nach dem Ende des Abonnements, vor dem endgültigen Stichtag | läuft, mit einem Hinweis auf die Verlängerung |
| Abgelaufen | nach dem endgültigen Stichtag | gesperrt: Die BVM kann sie nicht entschlüsseln |
Nach Ablauf der Kulanzfrist führt die Anwendung den Beweis, indem sie trotzdem versucht, die Pro-Methode aufzurufen:
Subscription expired: License expired
Basic average: 13.63
Pro forecast is locked. Renew your subscription to restore access.
(proof) encrypted Pro.Forecast blocked: License expiredBei wiederkehrender Abrechnung stellt normalerweise der Babel Licensing Service dieselbe Lizenz aus und verlängert sie. Er kann den Gültigkeitszeitraum verkürzen und Verlängerungen automatisch übermitteln. Die hier gezeigte Offline-Dateilizenz ist der einfachste Weg, die Übergänge zwischen aktiv, Kulanzfrist und abgelaufen zu zeigen.
keys.pem und die Passwörter im Beispiel dienen nur der Demonstration. Bewahren Sie den privaten RSA-Schlüssel
offline auf und stellen Sie Lizenzen auf Herstellerseite aus. Mit der Anwendung wird nur der öffentliche Schlüssel ausgeliefert.