Wie kann ich einen Produktschlüssel für meine C # -Anwendung erstellen?


90

Wie kann ich einen Produktschlüssel für meine C # -Anwendung erstellen?

Ich muss einen Produkt- (oder Lizenz-) Schlüssel erstellen, den ich jährlich aktualisiere. Zusätzlich muss ich eine für Testversionen erstellen.

Verbunden:



@stukelly, die gepostet wurde, nachdem J3r3myK seine Frage gepostet hat ...
Dozer789

Antworten:


82

Sie können beispielsweise einen Datensatz erstellen, der die Daten enthält, die Sie bei der Anwendung authentifizieren möchten. Dies kann alles umfassen, was Sie möchten - z. B. zu aktivierende Programmfunktionen, Ablaufdatum, Name des Benutzers (wenn Sie ihn an einen Benutzer binden möchten). Verschlüsseln Sie das dann mit einem Krypto-Algorithmus mit einem festen Schlüssel oder einem Hash. Dann überprüfen Sie es einfach in Ihrem Programm. Eine Möglichkeit, die Lizenzdatei (unter Windows) zu verteilen, besteht darin, sie als Datei bereitzustellen, die die Registrierung aktualisiert (ohne dass der Benutzer sie eingeben muss).

Achten Sie jedoch auf ein falsches Sicherheitsgefühl - früher oder später wird jemand einfach Ihr Programm patchen, um diese Prüfung zu überspringen und die gepatchte Version zu verteilen. Oder sie erarbeiten einen Schlüssel, der alle Prüfungen besteht und diese verteilt oder die Uhr zurückdatiert usw. Es spielt keine Rolle, wie kompliziert Sie Ihr Schema erstellen, alles, was Sie dafür tun, wird letztendlich Sicherheit durch Dunkelheit sein, und sie werden es immer tun dazu in der Lage sein. Auch wenn sie nicht können, wird und wird jemand die gehackte Version verbreiten. Gleiches gilt auch dann, wenn Sie einen Dongle liefern - wenn jemand möchte, kann er den Scheck auch dafür ausbessern. Das digitale Signieren Ihres Codes hilft nicht, sie können diese Signatur entfernen oder zurücktreten.

Sie können die Sache etwas komplizieren, indem Sie Techniken verwenden, um zu verhindern, dass das Programm in einem Debugger usw. ausgeführt wird, aber selbst dies ist nicht kugelsicher. Sie sollten es also nur so schwierig machen, dass ein ehrlicher Benutzer nicht vergisst, zu zahlen. Achten Sie auch darauf, dass Ihr System nicht für zahlende Benutzer aufdringlich wird. Es ist besser, einige Kopien abzureißen, als dass Ihre zahlenden Kunden nicht in der Lage sind, das zu verwenden, wofür sie bezahlt haben.

Eine weitere Option ist eine Online-Überprüfung. Geben Sie dem Benutzer einfach eine eindeutige ID, überprüfen Sie online, welche Funktionen diese ID haben sollte, und speichern Sie sie für einen bestimmten Zeitraum zwischen. Trotzdem gelten die gleichen Einschränkungen - Menschen können so etwas umgehen.

Berücksichtigen Sie auch die Supportkosten für Benutzer, die ihren Schlüssel vergessen haben usw.

edit: Ich möchte nur hinzufügen, investiere nicht zu viel Zeit in dieses oder denke, dass dein verschlungenes Schema irgendwie anders und unknackbar sein wird. Es wird nicht und kann nicht sein, solange die Leute die Hardware und das Betriebssystem steuern, auf dem Ihr Programm läuft. Entwickler haben versucht, immer komplexere Schemata dafür zu entwickeln, und dachten, wenn sie ihr eigenes System dafür entwickeln, wird es nur ihnen bekannt und daher "sicherer" sein. Aber es ist wirklich das Programmieräquivalent zum Versuch, eine Perpetual-Motion-Maschine zu bauen. :-)


1
Gute Zusammenfassung. Wenn jemand nicht glaubt, dass es einfach ist, CheatEngine nachzuschlagen, ist dies so einfach, dass Nicht-Programmierer dies tun können. Am besten machen Sie diese Ebene einfach.
Kelly

Ich habe das gleiche Problem. Ich habe einen Lizenzschlüssel für meine App mit dem Ablaufdatum und dem zuletzt protokollierten Datum zur Überprüfung erstellt. Das Problem besteht jedoch darin, dass ich den privaten Schlüssel hinzufügen muss, um die Datei zu bearbeiten und das zuletzt protokollierte Datum zu aktualisieren keine kluge Art, den Schlüssel in den Code zu setzen. irgendein Rat ?
Doicare

16

Wem vertraust Du?

Ich habe diesen Bereich immer als zu kritisch angesehen, um einem Dritten zu vertrauen, der die Laufzeitsicherheit Ihrer Anwendung verwaltet. Sobald diese Komponente für eine Anwendung geknackt ist, wird sie für alle Anwendungen geknackt. Es passierte Discreet in fünf Minuten, als sie vor Jahren eine Drittanbieter- Lizenzlösung für 3ds Max entwickelten ... Gute Zeiten!

Im Ernst, erwägen Sie, Ihre eigenen zu rollen, um die vollständige Kontrolle über Ihren Algorithmus zu haben. Wenn Sie dies tun, sollten Sie Komponenten in Ihrem Schlüssel wie folgt verwenden:

  • Lizenzname - Der Name des Clients (falls vorhanden), den Sie lizenzieren. Nützlich für die Verwaltung von Unternehmensbereitstellungen - geben Sie ihnen das Gefühl, einen "personalisierten" Namen in den Lizenzinformationen zu haben, die Sie ihnen bereitstellen.
  • Datum des Lizenzablaufs
  • Anzahl der Benutzer, die unter derselben Lizenz ausgeführt werden sollen. Dies setzt voraus, dass Sie die Möglichkeit haben, laufende Instanzen auf einer Site auf serverähnliche Weise zu verfolgen
  • Funktionscodes - damit Sie dasselbe Lizenzierungssystem für mehrere Funktionen und für mehrere Produkte verwenden können. Wenn es für ein Produkt geknackt ist, ist es natürlich für alle geknackt.

Dann prüfe sie verdammt noch mal und füge die gewünschte (umkehrbare) Verschlüsselung hinzu, um das Knacken zu erschweren.

Um einen Testlizenzschlüssel zu erstellen, müssen Sie lediglich Werte für die oben genannten Werte festlegen, die als "Testmodus" übersetzt werden.

Und da dies jetzt wahrscheinlich der wichtigste Code in Ihrer Anwendung / Firma ist, sollten Sie zusätzlich zu / anstelle der Verschleierung die Entschlüsselungsroutinen in eine native DLL-Datei einfügen und diese einfach per P / Invoke aufrufen .

Mehrere Unternehmen, für die ich gearbeitet habe, haben mit großem Erfolg allgemeine Ansätze gewählt. Oder vielleicht waren die Produkte es nicht wert, geknackt zu werden;)


3
Zu Ihrer Information ist die Verschlüsselung immer reversibel. Es wäre nutzlos, nicht lesen zu können, was verschlüsselt wurde. Hashing ist die einzige Möglichkeit, an die Sie denken könnten.
Samuel

"Rollen Sie nicht Ihr eigenes Krypto-Schema", das meiner Meinung nach von Bruce Scheier stammt (nicht sicher), ist der richtige Weg. Vielleicht möchten Sie einen Blick auf diese Antwort werfen: security.stackexchange.com/questions/2202/…
Shadok

Können Sie näher auf "..P / Invoke to it" eingehen. Ich habe mir die verlinkte Seite angesehen, aber es hat mich nicht klüger gemacht: - /
MrCalvin

11

Wenn Sie nach den Schlüsseln fragen, die Sie eingeben können, z. B. Windows-Produktschlüssel, basieren diese auf einigen Überprüfungen. Wenn Sie über die Schlüssel sprechen, die Sie kopieren und einfügen müssen, basieren sie auf einer digitalen Signatur (private Schlüsselverschlüsselung).

Eine einfache Produktschlüssellogik könnte darin bestehen, zunächst zu sagen, dass der Produktschlüssel aus vier 5-stelligen Gruppen besteht abcde-fghij-kljmo-pqrst, und dann interne Beziehungen anzugeben, wie f + k + p gleich a sein sollte, was die ersten Ziffern der 2 bedeutet , 3 und 4 Gruppe sollte insgesamt a. Dies bedeutet, dass 8xxxx-2xxxx-4xxxx-2xxxx gültig ist, ebenso 8xxxx-1xxxx-0xxxx-7xxxx. Natürlich würde es auch andere Beziehungen geben, einschließlich komplexer Beziehungen. Wenn die zweite Ziffer der ersten Gruppe ungerade ist, sollte auch die letzte Ziffer der letzten Gruppe ungerade sein. Auf diese Weise würde es Generatoren für Produktschlüssel geben, und die Überprüfung der Produktschlüssel würde einfach prüfen, ob sie allen Regeln entsprechen.

Verschlüsselung ist normalerweise die Informationsfolge über die Lizenz, die mit einem privaten Schlüssel (== digital signiert) verschlüsselt und in Base64 konvertiert wurde . Der öffentliche Schlüssel wird mit der Anwendung verteilt. Wenn die Base64-Zeichenfolge eintrifft, wird sie vom öffentlichen Schlüssel überprüft (== entschlüsselt), und wenn sie als gültig befunden wird, wird das Produkt aktiviert.


8

Ob es trivial oder schwer zu knacken ist, ich bin mir nicht sicher, ob es wirklich einen großen Unterschied macht.

Die Wahrscheinlichkeit, dass Ihre App geknackt wird, ist weitaus proportionaler zu ihrer Nützlichkeit als zur Stärke der Handhabung der Produktschlüssel.

Persönlich denke ich, dass es zwei Klassen von Benutzern gibt. Diejenigen, die bezahlen. Diejenigen, die es nicht tun. Diejenigen, die dies tun, werden dies wahrscheinlich selbst mit dem trivialsten Schutz tun. Diejenigen, die nicht auf einen Riss warten oder woanders suchen. In jedem Fall bringt es Ihnen kein Geld mehr.


6

Ich muss zugeben, dass ich etwas ziemlich Verrücktes tun würde.

  1. Suchen Sie einen CPU-Engpass und extrahieren Sie ihn in eine P / Invokeable DLL-Datei.
  2. Verschlüsseln Sie als Post-Build-Aktion einen Teil der DLL-Datei mit einem XOR-Verschlüsselungsschlüssel.
  3. Wählen Sie ein öffentliches / privates Schlüsselschema aus und fügen Sie den öffentlichen Schlüssel in die DLL-Datei ein
  4. Ordnen Sie dies so an, dass das Entschlüsseln des Produktschlüssels und das XOR-Verknüpfen der beiden Hälften zusammen den Verschlüsselungsschlüssel für die DLL ergibt.
  5. Deaktivieren Sie im DllMain-Code der DLL den Schutz (PAGE_EXECUTE_READWRITE) und entschlüsseln Sie ihn mit dem Schlüssel.
  6. Erstellen Sie eine LicenseCheck () -Methode, mit der der Lizenzschlüssel und die Parameter auf ihre Richtigkeit überprüft werden. Anschließend wird die gesamte DLL-Datei überprüft und eine Lizenzverletzung ausgelöst. Oh, und machen Sie hier eine andere Initialisierung.

Wenn sie den LicenseCheck finden und entfernen, wird der Spaß folgen, wenn die DLL mit Segmentierungsfehlern beginnt .


Müsste DEP dann nicht deaktiviert werden?
Rowland Shaw

Nein. Das Setzen von PAGE_EXECUTE_READWRITE ist die dokumentierte korrekte Methode zum Schreiben von selbstmodifizierendem Code und löscht das NX-Bit nur auf dieser Seite.
Joshua

8
Diese allgemeine Technik war in den späten 80ern sehr beliebt. Seine Schwäche war, dass "geheimer" Code in den Arbeitsspeicher entschlüsselt wird, was es einfach macht, von jeder laufenden Kopie der Software zu stehlen.
Ray Burns

5

Es gibt auch die Option Microsoft Software Licensing and Protection (SLP) -Dienste. Nachdem ich darüber gelesen habe, wünschte ich mir wirklich, ich könnte es benutzen.

Ich mag die Idee wirklich, Teile des Codes basierend auf der Lizenz zu blockieren. Heißes Zeug und das sicherste für .NET. Interessante Lektüre, auch wenn Sie es nicht benutzen!

Microsoft® Software Licensing and Protection (SLP) Services ist ein Softwareaktivierungsdienst, mit dem unabhängige Softwareanbieter (ISVs) flexible Lizenzbedingungen für ihre Kunden festlegen können. Microsoft SLP Services verwendet eine einzigartige Schutzmethode, mit der Sie Ihre Anwendungs- und Lizenzinformationen schützen und schneller auf den Markt kommen und gleichzeitig die Kunden-Compliance verbessern können.

Hinweis: Nur so kann ich ein Produkt mit vertraulichem Code (z. B. einem wertvollen Algorithmus) veröffentlichen.


Für diejenigen, die sich daran erinnern, dass sie abgesagt wurden: SLP wird erneut gestartet
Michael Olesen,

5

Wenn Sie eine einfache Lösung zum Erstellen und Überprüfen von Seriennummern suchen, versuchen Sie es mit Ellipter . Es verwendet Kryptografie mit elliptischen Kurven und verfügt über die Funktion "Ablaufdatum", mit der Sie Testversionen oder zeitlich begrenzte Registrierungsschlüssel erstellen können.


2

Ein weiteres gutes, kostengünstiges Tool für Produktschlüssel und Aktivierungen ist das Produkt InstallKey. Schauen Sie sich www.lomacons.com an


2

Eine einfache Methode ist die Verwendung einer GUID ( Globally Unique Identifier ). GUIDs werden normalerweise als 128-Bit-Werte gespeichert und üblicherweise als 32 hexadezimale Ziffern mit durch Bindestriche getrennten Gruppen angezeigt, z {21EC2020-3AEA-4069-A2DD-08002B30309D}.

Verwenden Sie den folgenden Code in C # by System.Guid.NewGuid().

getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.

_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/".

Ich hoffe, es hilft.


1

Der Trick besteht darin, einen Algorithmus zu haben, den nur Sie kennen (so dass er am anderen Ende dekodiert werden kann).

Es gibt einfache Dinge wie: "Wähle eine Primzahl und füge eine magische Zahl hinzu"

Umfassendere Optionen wie die Verwendung einer asymmetrischen Verschlüsselung eines Satzes von Binärdaten (die eine eindeutige Kennung, Versionsnummern usw. enthalten können) und die Verteilung der verschlüsselten Daten als Schlüssel.

Könnte auch wert sein , die Antworten auf das Lesen dieser Frage als auch


6
"Der Trick besteht darin, einen Algorithmus zu haben, den nur Sie kennen" - dies ist so ziemlich die Definition von Sicherheit durch Dunkelheit und eine wirklich schlechte Idee.
Nick Johnson

3
Die gesamte Lizenzierung erfolgt jedoch über einen Algorithmus, der Geheimnisse beinhaltet. Die Lizenzierung wird oft am besten durch Investitionen in Anwälte angegangen, anstatt durch das Wettrüsten, "unzerbrechliche" Schlüssel zu entwickeln
Rowland Shaw,

+1 für den Kommentar zur Durchsetzung der Lizenz auf legalem Wege
Rob

Ja, alle Lizenzen sind schwach, genau wie bei DRM. Das Verlassen auf einen geheimen Algorithmus ist jedoch nachweislich schwächer .
Nick Johnson

1
Ich habe dir +1 für eine gute Antwort gegeben und wünschte, ich würde dir noch einen geben, um der Abwärtsabstimmung entgegenzuwirken. Leider gibt es einige sehr unreife kleine Babys auf der Welt.
ProfK


0

Sie können LicenseSpot überprüfen . Es bietet:

  • Kostenlose Lizenzkomponente
  • Online-Aktivierung
  • API zur Integration Ihrer App und Ihres Online-Shops
  • Generierung von Seriennummern
  • Lizenzen widerrufen
  • Abonnementverwaltung

1
"Free" ist nicht wirklich kostenlos. Es ist kostenlos, die Lizenzierungskomponente in Ihre App einzubetten. Es ist für die App nicht kostenlos , die Lizenzierungskomponente tatsächlich zu verwenden . Über 10 Aktivierungen hinaus müssen Sie eine monatliche Gebühr zahlen. Es ist kein Prozentsatz pro Aktivierung. Für kostengünstige .NET-Apps mit geringem Volumen ist dieses Preismodell ein Nachteil. Es ist nicht wie im Apple AppStore für .NET-Apps.
Cheeso

0

Ich werde ein wenig auf die großartige Antwort von @ frankodwyer zurückgreifen und mich ein wenig eingehender mit der online-basierten Lizenzierung befassen. Ich bin der Gründer von Keygen , einer Lizenzierungs-REST-API, die für Entwickler entwickelt wurde.

Da Sie erwähnt haben, dass Sie zwei "Arten" von Lizenzen für Ihre Anwendung wünschen, dh eine "Vollversion" und eine "Testversion", können wir dies vereinfachen und ein Funktionslizenzmodell verwenden, in dem Sie bestimmte Funktionen Ihrer Anwendung lizenzieren (in diesem Fall: Es gibt einen "vollständigen" Funktionsumfang und einen "Test" -Featuresatz.

Um beginnen, wir 2 schaffen könnten Lizenztypen ( so genannte Richtlinien in Keygen) und immer dann , wenn ein Benutzer ein Konto registriert können Sie eine „trial“ Lizenz generieren für sie beginnen (die „Studie“ Lizenz implementiert unsere „trial“ -Feature Politik) , mit dem Sie verschiedene Überprüfungen innerhalb der App durchführen können, z. B. können Benutzer Trial-Feature-A und Trial-Feature-B verwenden .

Darauf aufbauend können Sie bei jedem Kauf Ihrer App durch einen Benutzer (unabhängig davon, ob Sie PayPal, Stripe usw. verwenden) eine Lizenz generieren, die die Richtlinie für "vollständige" Funktionen implementiert, und diese dem Benutzerkonto zuordnen . Jetzt können Sie in Ihrer App überprüfen, ob der Benutzer über eine "vollständige" Lizenz verfügt, die Pro-Feature-X und Pro-Feature-Y ausführen kann (indem Sie so etwas tun user.HasLicenseFor(FEATURE_POLICY_ID)).

Ich erwähnte , so dass die Benutzer erstellen Benutzerkonten -Was ich damit meine ich? Ich habe in einigen anderen Antworten ausführlich darauf eingegangen , aber einen kurzen Überblick darüber, warum ich denke, dass dies eine hervorragende Möglichkeit ist, Ihre Benutzer zu authentifizieren und zu identifizieren:

  1. Mit Benutzerkonten können Sie einem einzelnen Benutzer mehrere Lizenzen und mehrere Computer zuordnen , um einen Einblick in das Verhalten Ihrer Kunden zu erhalten und sie zu "In-App-Käufen" aufzufordern, dh zum Kauf Ihrer "Vollversion" (ähnlich wie bei mobilen Apps).
  2. Wir sollten von unseren Kunden nicht verlangen, lange Lizenzschlüssel einzugeben, die sowohl mühsam einzugeben als auch schwer nachzuverfolgen sind, dh sie gehen leicht verloren. (Versuchen Sie, auf Twitter nach "verlorenem Lizenzschlüssel" zu suchen!)
  3. Kunden sind es gewohnt, eine E-Mail / ein Passwort zu verwenden . Ich denke, wir sollten das tun, was die Leute gewohnt sind, damit wir eine gute Benutzererfahrung (UX) bieten können.

Natürlich, wenn Sie nicht wollen , Benutzerkonten zu handhaben und Sie möchten Ihre Benutzer zur Eingabe von Lizenzschlüsseln, die (und Keygen völlig in Ordnung unterstützt das auch tun ). Ich biete nur einen anderen Weg an, um diesen Aspekt der Lizenzierung zu behandeln und Ihren Kunden hoffentlich eine nette UX bereitzustellen.

Da Sie auch erwähnt haben, dass Sie diese Lizenzen jährlich aktualisieren möchten, können Sie eine Dauer für Ihre Richtlinien festlegen , sodass "vollständige" Lizenzen nach einem Jahr ablaufen und "Test" -Lizenzen beispielsweise 2 Wochen dauern und Ihre Benutzer eine neue erwerben müssen Lizenz nach Ablauf.

Ich könnte mich mehr mit der Zuordnung von Maschinen zu Benutzern und ähnlichen Dingen befassen, aber ich dachte, ich würde versuchen, diese Antwort kurz zu halten und mich darauf zu konzentrieren, Funktionen einfach an Ihre Benutzer zu lizenzieren.


0

Bitte überprüfen Sie diese Antwort: https://stackoverflow.com/a/38598174/1275924

Die Idee ist, Cryptolens als Lizenzserver zu verwenden. Hier ist ein schrittweises Beispiel (in C # und VB.NET). Ich habe auch ein Code-Snippet zur Schlüsselüberprüfung angehängt (in C #):

var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";

var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
    Key = licenseKey,
    ProductId = 3349,
    Sign = true,
    MachineCode = Helpers.GetMachineCode()
});

if (result == null || result.Result == ResultType.Error ||
    !result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
    // an error occurred or the key is invalid or it cannot be activated
    // (eg. the limit of activated devices was achieved)
    Console.WriteLine("The license does not work.");
}
else
{
    // everything went fine if we are here!
    Console.WriteLine("The license is valid!");
}

Console.ReadLine();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.