386 Stimmen

Wie werden Software-Lizenzschlüssel generiert?

Lizenzschlüssel sind der defacto-Standard als Anti-Piraterie-Maßnahme. Um ehrlich zu sein, erscheint mir dies als (Un)Sicherheit durch Obskurität obwohl ich wirklich keine Ahnung habe, wie Lizenzschlüssel generiert werden. Was ist ein gutes (sicheres) Beispiel für die Erzeugung von Lizenzschlüsseln? Welches kryptografische Primitiv (wenn überhaupt) wird dabei verwendet? Ist es ein Message Digest? Wenn ja, welche Daten werden dann gehasht? Welche Methoden setzen die Entwickler ein, um es Crackern zu erschweren, ihre eigenen Schlüsselgeneratoren zu bauen? Wie werden Schlüsselgeneratoren hergestellt?

285voto

Bei herkömmlichen CD-Schlüsseln ging es nur darum, einen Algorithmus zu entwickeln, für den CD-Schlüssel (die eine beliebige Zeichenkette sein können) leicht zu erzeugen und leicht zu überprüfen sind, aber das Verhältnis zwischen gültigen und ungültigen CD-Schlüsseln ist so gering, dass es unwahrscheinlich ist, dass man durch zufälliges Raten einen gültigen CD-Schlüssel erhält.

NICHT KORREKT ZU TUN:

Starcraft y Halbwertszeit beide verwendeten dieselbe Prüfsumme, wobei die 13. Stelle die ersten 12 verifizierte. So konnte man für die ersten 12 Ziffern irgendetwas eingeben und die 13. erraten (es gibt nur 10 Möglichkeiten), was zu dem berüchtigten 1234-56789-1234

Der Algorithmus zur Überprüfung ist öffentlich und sieht in etwa so aus:

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

DIE RICHTIGE ART, ES ZU TUN

Windows XP nimmt eine ganze Reihe von Informationen auf, verschlüsselt sie und bringt die Buchstaben- und Zahlenverschlüsselung auf einem Aufkleber an. Auf diese Weise konnte MS sowohl Ihren Schlüssel überprüfen y gleichzeitig den Produkttyp (Home, Professional usw.) erhalten. Außerdem ist eine Online-Aktivierung erforderlich.
Der vollständige Algorithmus ist recht komplex, aber gut beschrieben in este (völlig legales!) Papier, das in Deutschland veröffentlicht wurde.

Natürlich ist es egal, was Sie tun, es sei denn, Sie bieten einen Online-Dienst an (wie Welt von Warcraft ), ist jede Art von Kopierschutz nur eine Hinhaltetaktik: Wenn es sich um ein wertvolles Spiel handelt, wird es leider jemand knacken (oder zumindest zu umgehen) den CD-Schlüssel-Algorithmus und alle anderen urheberrechtlichen Schutzmaßnahmen.

REAL DIE RICHTIGE VORGEHENSWEISE:

Für Online-Dienste ist das Leben etwas einfacher, da man sich selbst mit der Binärdatei bei deren Servern authentifizieren muss, um sie überhaupt nutzen zu können (z. B. ein WoW-Konto haben). Der CD-Schlüssel-Algorithmus für World of Warcraft - der z. B. beim Kauf von Spielzeitkarten verwendet wird - sieht wahrscheinlich etwa so aus:

  1. Generieren Sie eine sehr große, kryptographisch sichere Zufallszahl.
  2. Speichern Sie sie in unserer Datenbank und drucken Sie sie auf die Karte.

    Wenn dann jemand eine Spielzeitkartennummer eingibt, prüfen Sie, ob sie in der Datenbank vorhanden ist, und wenn ja, verknüpfen Sie diese Nummer mit dem aktuellen Benutzer, damit sie nie wieder verwendet werden kann.

Für Online-Dienste gibt es keinen Grund pas das obige Schema zu verwenden; die Verwendung eines anderen Schemas kann zu Problemen führen .

57voto

PaulG Punkte 13461

Als ich diese Antwort ursprünglich schrieb, ging ich davon aus, dass sich die Frage auf die "Offline"-Validierung von Lizenzschlüsseln bezog. Die meisten anderen Antworten beziehen sich auf die Online-Überprüfung, die wesentlich einfacher zu handhaben ist (der größte Teil der Logik kann serverseitig ausgeführt werden).

Bei der Offline-Verifizierung besteht die größte Schwierigkeit darin, eine große Anzahl eindeutiger Lizenzschlüssel zu generieren und trotzdem einen starken Algorithmus beizubehalten, der nicht leicht zu kompromittieren ist (z. B. eine einfache Prüfziffer).

Ich bin nicht sehr bewandert in Mathematik, aber mir ist aufgefallen, dass eine Möglichkeit, dies zu tun, darin besteht, eine mathematische Funktion das einen Graphen aufzeichnet

Die gezeichnete Linie kann (wenn Sie eine ausreichend hohe Frequenz verwenden) Tausende von eindeutigen Punkten haben, so dass Sie Schlüssel generieren können, indem Sie zufällige Punkte auf diesem Diagramm auswählen und die Werte auf irgendeine Weise kodieren

enter image description here

Als Beispiel zeichnen wir diesen Graphen, wählen vier Punkte aus und kodieren sie in einen String als "0,-500;100,-300;200,-100;100,600"

Wir verschlüsseln die Zeichenkette mit einem bekannten und festen Schlüssel (schrecklich schwach, aber es erfüllt seinen Zweck) und konvertieren dann die resultierenden Bytes durch Base32 um den endgültigen Schlüssel zu erzeugen

Die Anwendung kann dann diesen Prozess umkehren (base32 in eine reelle Zahl umwandeln, entschlüsseln, die Punkte entschlüsseln) und dann überprüfen, ob jeder dieser Punkte in unserem geheimen Graphen enthalten ist.

Es handelt sich um einen relativ kleinen Code, mit dem eine große Anzahl eindeutiger und gültiger Schlüssel erzeugt werden kann

Es handelt sich jedoch in hohem Maße um Sicherheit durch Unklarheit. Jeder, der sich die Zeit nimmt, den Code zu zerlegen, könnte die Grafikfunktion und die Verschlüsselungsschlüssel finden und dann einen Schlüsselgenerator basteln, aber es ist wahrscheinlich recht nützlich, um die Gelegenheitspiraterie einzudämmen.

37voto

The Surrican Punkte 27908

Lesen Sie diesen Artikel auf Partielle Schlüsselüberprüfung der die folgenden Anforderungen abdeckt:

  • Die Lizenzschlüssel müssen leicht einzugeben sein.

  • Wir müssen in der Lage sein, einen Lizenzschlüssel im Falle von Rückbuchungen oder Käufen mit gestohlenen Kreditkarten auf eine schwarze Liste zu setzen (zu widerrufen).

  • Kein "nach Hause telefonieren", um Schlüssel zu testen. Obwohl sich diese Praxis immer mehr durchsetzt, schätze ich sie als Benutzer immer noch nicht und werde daher von meinen Benutzern nicht verlangen, dass sie sich damit abfinden.

  • Es sollte für einen Cracker nicht möglich sein, unsere freigegebene Anwendung zu disassemblieren und daraus ein funktionierendes "Keygen" zu erstellen. Das bedeutet, dass unsere Anwendung einen Schlüssel nicht vollständig auf seine Verifizierbarkeit prüfen kann. Es wird nur ein Teil des Schlüssels getestet. Außerdem sollte jede Version der Anwendung einen anderen Teil des Schlüssels testen, so dass ein gefälschter Schlüssel, der auf einer früheren Version basiert, nicht mit einer späteren Version unserer Software funktioniert.

  • Wichtig: Es sollte nicht möglich sein, dass ein rechtmäßiger Benutzer versehentlich einen ungültigen Schlüssel eingibt, der zwar zu funktionieren scheint, aber in einer zukünftigen Version aufgrund eines Tippfehlers nicht funktioniert.

23voto

Andrew Aylett Punkte 37790

Ich habe keine Erfahrung damit, wie die Leute tatsächlich CD-Schlüssel erzeugen, aber (vorausgesetzt, Sie wollen nicht den Weg der Online-Aktivierung gehen) hier sind ein paar Möglichkeiten, wie man einen Schlüssel machen könnte:

  • Verlangen Sie, dass die Zahl durch (beispielsweise) 17 teilbar ist. Trivial zu erraten, wenn man Zugang zu vielen Schlüsseln hat, aber die Mehrheit der möglichen Zeichenfolgen wird ungültig sein. Ähnlich wäre es, wenn man verlangen würde, dass die Prüfsumme des Schlüssels mit einem bekannten Wert übereinstimmt.

  • Verlangt, dass die erste Hälfte des Schlüssels, wenn sie mit einem bekannten Wert verkettet wird, auf die zweite Hälfte des Schlüssels heruntergehasht wird. Besser, aber das Programm enthält immer noch alle Informationen, die für die Erzeugung von Schlüsseln und deren Validierung erforderlich sind.

  • Generierung von Schlüsseln durch Verschlüsselung (mit einem privaten Schlüssel) eines bekannten Wertes + Nonce. Dies kann durch Entschlüsselung mit dem entsprechenden öffentlichen Schlüssel und Verifizierung des bekannten Wertes überprüft werden. Das Programm verfügt nun über genügend Informationen, um den Schlüssel zu verifizieren, ohne Schlüssel generieren zu können.

Diese sind nach wie vor angreifbar: Das Programm ist immer noch vorhanden und kann gepatcht werden, um die Prüfung zu umgehen. Cleverer wäre es, einen Teil des Programms mit dem bekannten Wert aus meiner dritten Methode zu verschlüsseln, anstatt den Wert im Programm zu speichern. Auf diese Weise müsste man eine Kopie des Schlüssels finden, bevor man das Programm entschlüsseln könnte, aber es ist immer noch anfällig dafür, dass es kopiert wird, sobald es entschlüsselt ist, und dass eine Person ihre legitime Kopie nimmt und sie benutzt, um allen anderen den Zugriff auf die Software zu ermöglichen.

19voto

Michael Stum Punkte 172055

CD-Schlüssel sind keine große Sicherheit für nicht vernetzte Dinge, also müssen sie technisch gesehen nicht sicher generiert werden. Wenn Sie auf .net sind, können Sie fast mit Guid.NewGuid() gehen.

Heutzutage werden sie hauptsächlich für die Multiplayer-Komponente verwendet, bei der ein Server den CD-Schlüssel verifizieren kann. Dabei ist es unwichtig, wie sicher er generiert wurde, da es auf "Nachschlagen, was auch immer eingegeben wird, und prüfen, ob jemand anderes ihn bereits verwendet" hinausläuft.

Dennoch können Sie einen Algorithmus verwenden, um zwei Ziele zu erreichen:

  • Sie haben eine Art Prüfsumme. Damit kann Ihr Installer die Meldung "Key doesn't seem valid" (Schlüssel scheint ungültig) anzeigen, nur um Tippfehler zu erkennen (Das Hinzufügen einer solchen Prüfung im Installer bedeutet, dass das Schreiben eines Schlüsselgenerators trivial ist, da der Hacker den gesamten Code hat, den er braucht. Wenn Sie die Prüfung weglassen und sich ausschließlich auf die serverseitige Validierung verlassen, wird diese Prüfung deaktiviert, mit dem Risiko, dass Sie Ihre legalen Kunden verärgern, die nicht verstehen, warum der Server ihren CD-Schlüssel nicht akzeptiert, da sie sich des Tippfehlers nicht bewusst sind)
  • Arbeiten Sie mit einer begrenzten Anzahl von Zeichen. Versuchen Sie, einen CD-Schlüssel einzugeben und raten Sie: "Ist das eine 8 oder ein B? eine 1 oder ein I? ein Q oder ein O oder eine 0?" - Durch die Verwendung einer Untergruppe von nicht eindeutigen Zeichen/Ziffern wird diese Verwirrung vermieden.

Trotzdem ist es wichtig, dass der Schlüssel breit gestreut ist und eine gewisse Zufälligkeit aufweist, um zu verhindern, dass ein Raubkopierer einfach einen gültigen Schlüssel errät (der zwar in Ihrer Datenbank gültig ist, sich aber noch in einer Schachtel in einem Ladenregal befindet) und einen rechtmäßigen Kunden, der zufällig diese Schachtel kauft, übers Ohr haut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X