webentwicklung-frage-antwort-db.com.de

Wie kann ich einen Product Key für meine C # -Anwendung erstellen?

88
J3r3myK

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. Programmfunktionen zum Aktivieren, Ablaufdatum, Name des Benutzers (wenn Sie ihn an einen Benutzer binden möchten). Dann verschlüsseln Sie das mit einem Krypto-Algorithmus mit einem festen Schlüssel oder Hash. Dann verifizierst du es einfach in deinem Programm. Eine Möglichkeit zum Verteilen der Lizenzdatei (unter Windows) besteht darin, sie als Datei bereitzustellen, die die Registrierung aktualisiert (der Benutzer muss sie nicht eingeben).

Vorsicht vor falschem Sicherheitsempfinden - früher oder später wird Ihr Programm einfach gepatcht, um diese Prüfung zu überspringen und die gepatchte Version zu verteilen. Oder sie werden einen Schlüssel ausarbeiten, der alle Prüfungen besteht und diesen verteilt, oder die Uhr zurückdatieren usw. Es spielt keine Rolle, wie kompliziert Sie Ihr Schema gestalten, alles, was Sie dafür tun, wird letztendlich Sicherheit durch Unbekanntheit sein, und sie werden es immer sein dazu in der Lage sein. Auch wenn sie nicht können, wird jemand die gehackte Version verbreiten. Gleiches gilt auch, wenn Sie einen Dongle bereitstellen - wenn jemand dies wünscht, kann er den Scheck auch dafür ausbessern. Das digitale Signieren Ihres Codes hilft nicht weiter. Sie können diese Signatur entfernen oder zurücktreten.

Sie können die Angelegenheit etwas komplizieren, indem Sie Techniken anwenden, um zu verhindern, dass das Programm in einem Debugger usw. ausgeführt wird, aber selbst dies ist kein Aufzählungszeichen. Sie sollten es also nur so schwer machen, dass ein ehrlicher Benutzer die Zahlung nicht vergisst. Seien Sie auch sehr vorsichtig, dass Ihr System zahlenden Nutzern nicht aufdringlich wird - es ist besser, einige Kopien zu fälschen, als wenn Ihre zahlenden Kunden nicht in der Lage sind, das zu verwenden, wofür sie bezahlt haben.

Eine andere Möglichkeit ist eine Online-Überprüfung: Geben Sie dem Benutzer einfach eine eindeutige ID und überprüfen Sie online, welche Funktionen diese ID haben sollte, und speichern Sie sie für einen bestimmten Zeitraum im Cache. Trotzdem gelten die gleichen Vorsichtsmaßnahmen - Menschen können so etwas umgehen.

Berücksichtigen Sie auch die Supportkosten, wenn Sie sich mit Benutzern befassen müssen, die ihren Schlüssel vergessen haben usw.

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

80
frankodwyer

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 diskret in fünf Minuten, als sie vor == Jahren mit einer Drittanbieter-Lizenzlösung für ds Max begannen ... Gute Zeiten!

Im Ernst, überlegen Sie sich, ob Sie Ihr eigenes Rolling durchführen können, um die vollständige Kontrolle über Ihren Algorithmus zu haben. In diesem Fall 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, ausgeführte Instanzen auf einer Site auf serverbezogene Weise zu verfolgen
  • Funktionscodes - Damit Sie dasselbe Lizenzierungssystem für mehrere Funktionen und für mehrere Produkte verwenden können. Natürlich, wenn es für ein Produkt geknackt ist, ist es für alle geknackt.

Dann prüfe die verdammte Summe 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 obigen Werte festlegen, die als "Testmodus" übersetzt werden.

Und da dies jetzt wahrscheinlich der wichtigste Code in Ihrer Anwendung/Ihrem Unternehmen ist, sollten Sie zusätzlich zu/anstelle der Verschleierung die Entschlüsselungsroutinen in eine native DLL Datei und einfach P/Rufen Sie auf.

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

15
Spiffeah

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

Eine einfache Product Key-Logik könnte darin bestehen, dass der Product Key aus vier 5-stelligen Gruppen besteht, z. B. abcde-fghij-kljmo-pqrst, und legen Sie dann fest, dass interne Beziehungen wie f + k + p gleich a sein sollen. Dies bedeutet, dass die ersten Ziffern der Gruppen 2, 3 und 4 eine Summe von a ergeben sollen. Dies bedeutet, dass 8xxxx-2xxxx-4xxxx-2xxxx gültig ist, ebenso wie 8xxxx-1xxxx-0xxxx-7xxxx. Natürlich gibt es auch andere Beziehungen, 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 sind normalerweise die Informationen über die Lizenz, die mit einem privaten Schlüssel (== digital signiert) verschlüsselt und in Base64 konvertiert wurden. 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.

11
Kinjal Dixit

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 zu der Stärke der Handhabung von Produktschlüsseln.

Persönlich denke ich, dass es zwei Benutzerklassen gibt. Diejenigen, die bezahlen. Diejenigen, die das nicht tun. Diejenigen, die dies tun, werden dies wahrscheinlich sogar mit dem geringsten Schutz tun. Diejenigen, die nicht auf einen Riss warten oder woanders hinschauen. So oder so, es bringt dir kein Geld mehr.

8
spender

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

  1. Finden Sie einen CPU-Engpass und extrahieren Sie ihn in eine P/Invokeable DLL Datei.
  2. Verschlüsseln Sie als Nachbearbeitungsaktion einen Teil der DLL 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 Product Keys 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, und addieren Sie dann die gesamte DLL Datei, wobei entweder eine Lizenzverletzung verursacht wird. Oh, und führen Sie hier eine andere Initialisierung durch.

Wenn sie den LicenseCheck finden und entfernen, wird was für ein Spaß folgen, wenn die DLL startet Segmentierungsfehler .

6
Joshua

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

5
Roland

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

Ich mag die Idee, 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® SLP-Dienste (Software Licensing and Protection) sind Software-Aktivierungsdienste, mit denen 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 können, sodass Sie schneller auf den Markt kommen und die Kundenkonformität erhöhen können.

Hinweis: Dies ist die einzige Möglichkeit, ein Produkt mit vertraulichem Code (z. B. einem wertvollen Algorithmus) freizugeben.

5
ccook

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

2
Che

Eine einfache Methode ist die Verwendung eines global eindeutigen Bezeichners (GUID). GUIDs werden normalerweise als 128-Bit-Werte gespeichert und in der Regel als 32 hexadezimale Ziffern mit durch Bindestriche getrennten Gruppen angezeigt, z. B. {21EC2020-3AEA-4069-A2DD-08002B30309D}.

Verwenden Sie den folgenden Code in C # von 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.

2
Aishwar C Nigam

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

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

Kompliziertere Optionen wie die asymmetrische 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.

Lesen Sie auch die Antworten auf diese Frage

1
Rowland Shaw

Es gibt einige Tools und APIs dafür. Allerdings glaube ich nicht, dass du einen kostenlos finden wirst;)

Es gibt zum Beispiel die OLicense Suite: http://www.olicense.de/index.php?lang=de

1

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

  • Kostenlose Lizenzierungskomponente
  • Online Aktivierung
  • API zur Integration Ihrer App und Ihres Onlineshops
  • Seriennummerngenerierung
  • Lizenzen entziehen
  • Abonnementverwaltung
0
Jose

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 für die Schlüsselüberprüfung unten 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();
0
Artem