Ich weiss, das Thema gabs schon zigfach, und ich weiss auch: Einen sicheren Kopierschutz kann es nicht geben. Was jedoch geht, ist den Aufwand für den Angreifer möglichst hoch zu setzen.
Mir geht es darum eine, Idee auf Durchführbarkeit zu prüfen, wie man dieses Ziel mit möglichst wenig eigenem Aufwand realisieren könnte.
Was will ich erreichen?
Ziel soll es sein, eine Lizenz auf einen bestimmten Rechner festzulegen. Das Kopieren der Software soll ohne Funktionalitätseinbussen nicht möglich sein.
Wie will ich es erreichen?
Basis des mir vorschwebenden Verfahrens soll ein Public Key Kryptosystem sein.
Dabei gelten folgende Randbedingungen:
- Wir befinden uns in der .NET - Welt
- Der Private Key soll abhängig vom Rechner jedes mal neu berechnet und NIE irgendwo abgelegt werden
Das heisst: Der Key muss auf einem Rechner jedes mal berechnet werden und immer das gleiche Ergebnis geben. Wird die Software auf einem anderen Rechner ausgeführt ändert sich entsprechend der Key.
- Ein Teil der Software muss mit dem Public Key des Rechners verschlüsselt abgelegt werden
Dies erfordert freilich ein eigenes, nur für diesen Rechner verschlüsseltes Assembly.
- Eine 'Aktivierung' der Lizenz soll über das Internet möglich sein
Idee: Mit einem gültigen (gekauften) Lizenzschlüssel kann einmalig(!) von der Software das verschlüsselte Assembly per Webservice abgerufen werden. Hierzu wird der Public Key und der Lizenzschlüssel übertragen und das verschlüsselte Assembly zurückgeliefert. Ist der Key verbraucht muss ein neuer Key angefordert werden (z.B. wenn die Software von einem Rechner auf einen anderen Umgezogen wird).
Keygens greifen nicht, da ein erzeugter Key in einer Datenbank eingetragen wird und beim abrufen des Assemblys durch den Webservice geprüft und danach gelöscht wird. Somit wird sichergestellt, dass nur gültige und bezahlte Keys auch ein Assembly bekommen.
Das Assembly mit den entsprechenden Funktionalitäten liegt also nur für den entsprechenden Rechner verschlüsselt auf der Platte. Die Applikation liest das Assembly ein, entschlüsselt es mit dem Private Key und läd es. Diese Prozedur ist zwingend, ein unverschlüsseltes Assembly kann nicht geladen werden.
Die Applikation selber ist ein signiertes Assembly, so dass Modifikationen an der Executable dazu führen, dass die Anwendung nicht mehr gestartet werden kann.
Was haltet ihr von diesem Konzept? Insbesondere spreche ich freilich unsere Spezialisten an