Software freischalten per Schlüssel

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wenn Sie eine Software weitergeben, wollen Sie natürlich sicherstellen, dass diese nur von Kunden genutzt wird, die auch für die Software bezahlt haben. Wie können Sie das sicherstellen Eine Möglichkeit ist es, in Abhängigkeit von einem Benutzernamen einen Freischaltungsschlüssel zu erzeugen, den der Benutzer in die Anwendung eingeben muss, damit diese funktioniert. Auf diese Weise sorgen Sie nicht nur dafür, dass der Benutzer diesen Schlüssel erwerben muss, wenn er die Anwendung nutzen will. Damit ist gleichzeitig sichergestellt, dass Sie – wenn ein Benutzer die Anwendung weitergibt oder diese sogar in einem Portal zum Download bereitstellt – herausfinden, welcher Kunde die Software weitergegeben hat. Dieser Beitrag liefert die technischen Grundlagen für den Schutz einer Software mit Freischaltungsschlüssel.

Voraussetzung

Voraussetzung für den Schutz der Software mit einem Freischaltungsschlüssel ist natürlich, dass Sie diese nur als .mde– oder .accde-Datei weitergeben. Anderenfalls kann der Benutzer ja einfach in den Code schauen und die Schutzmaßnahme aushebeln.

Startformular

Die Abfrage der Daten für die Freischaltung, also der E-Mail-Adresse und des Freischaltungsschlüssels, soll in einem Startformular erfolgen. Dieses heißt frmStart und sieht wie in Bild 1 aus. Für das Formular stellen wir die Eigenschaften Bildlaufleisten, Navigationsschaltflächen, Datensatzmarkierer und Trennlinien auf Nein und Automatisch zentrieren auf Ja ein. Außerdem soll das Formular als Popup geöffnet werden, also so, dass der Benutzer keine weiteren Aktionen ausführen kann, wenn dieses Formular nicht geschlossen wurde. Dazu stellen wir die Eigenschaft Popup auf Ja ein.

Formular zum Freischalten der Anwendung

Bild 1: Formular zum Freischalten der Anwendung

Um die vom Benutzer in die beiden Textfelder txtEMail und txtSchluessel eingegebenen Daten zu speichern, arbeiten wir mit einer Tabelle namens tblOptionen. Diese ist wie in Bild 2 aufgebaut und enthält die drei Felder ID, EMail und Schluessel. Im Auflieferungszustand soll die Tabelle einen leeren Datensatz enthalten.

Tabelle zum Speichern der Freischaltungsdaten

Bild 2: Tabelle zum Speichern der Freischaltungsdaten

Damit der Benutzer die Daten über das Formular frmStart eingeben kann, binden wir das Formular ausnahmsweise nicht über die Eigenschaft Datenherkunft an die Tabelle tblOptionen. Wir wollen die eingegebenen Daten ja nur dann speichern, wenn der Benutzer ein passendes Paar von E-Mail und Schlüssel eingegeben hat. In diesem Fall soll das Formular frmStart gar nicht mehr erscheinen, sondern direkt das erste Formular der Anwendung angezeigt werden.

Startformular einrichten

Damit das Formular frmStart direkt beim öffnen der Anwendung angezeigt wird, stellen wir in den Access-Optionen, die Sie über den Eintrag Optionen unter dem Ribbon-Tab Datei öffnen, im Bereich Aktuelle Datenbank unter Anwendungsoptionen die Eigenschaft Formular anzeigen auf das Formular frmStart ein (siehe Bild 3).

Einstellen des Formulars frmStart als Startformular

Bild 3: Einstellen des Formulars frmStart als Startformular

Wenn wir die Anwendung nun neu starten, um das Formular frmStart direkt beim Start anzuzeigen, gelingt das auf den ersten Blick wie gewünscht. Allerdings kann man trotz des Modus als Popup noch direkt auf die Elemente des Navigationsbereichs oder des Ribbons zugreifen. Um dies zu verhindern, müssen wir auch noch die Eigenschaft Modal auf True einstellen. Dies gelingt allerdings nicht über das Eigenschaftsfenster, sodass wir die entsprechende Zuweisung in einer Prozedur unterbringen, die durch das Ereignis Beim Laden des Formulars ausgelöst wird. Diese Prozedur sieht wie folgt aus:

Private Sub Form_Load()
     Me.Modal = True
End Sub

Nun zeigt das Formular allerdings immer noch die Titelleiste sowie die Schaltflächen zum Schließen, Minimieren und Maximieren an (siehe Bild 4). Dies ändern wir noch, indem wir die Eigenschaft Rahmenart auf Keine einstellen. Dadurch erscheint das Formular etwa unter Access 2016, wo der Hintergrund weiß ist, wie in Bild 5. Das sind jedoch Spielereien – wichtig ist, dass der Benutzer nicht um den Aufruf dieses Formulars herumkommt.

Anzeige des Startformulars

Bild 4: Anzeige des Startformulars

Formular als Popup öffnen

Bild 5: Formular als Popup öffnen

übrigens: Wenn Sie das Formular auf diese Art geöffnet haben, können Sie es nicht über die herkömmlichen Elemente der Benutzeroberfläche wieder schließen – auch nicht mit der Tastenkombination Strg + F4 oder durch einen Wechsel in die Entwurfsansicht mit der Tastenkombination Strg + Komma (,).

Allerdings führt der Versuch, die Anwendung mit Alt + F4 zu schließen, zunächst zum Schließen des Formulars und dann bei erneuter Betätigung zum Schließen der Anwendung. Diesen Weg müssten wir also noch blockieren. Dazu hinterlegen wir eine Prozedur für die Ereignis-eigenschaft Bei Taste ab des Formulars selbst, die wir wie folgt füllen:

Private Sub Form_KeyDown(KeyCode As Integer,  Shift As Integer)
     Select Case KeyCode
         Case 115
             Select Case Shift
                 Case acAltMask
                     KeyCode = 0
             End Select
     End Select
End Sub

Damit diese Prozedur auch dann feuert, wenn eines der Steuerelemente des Formulars den Fokus hat, stellen wir noch die Eigenschaft Tastenvorschau auf Ja ein.

Wie können wir das Formular aber nun beim Entwickeln noch schließen, ohne direkt die komplette Anwendung schließen zu müssen Der einzige Weg, der übrig bleibt, ist der über den Direktbereich des VBA-Fensters. Diesen rufen Sie mit der Tastenkombination Strg + G auf und geben dort die folgende Anweisung ein:

DoCmd.Close acForm, "frmStart"

Eingabe des Freigabeschlüssels

Damit kommen wir zum Freigabeschlüssel selbst. Diesen soll der Benutzer neben der E-Mail-Adresse in das entsprechende Textfeld eingeben. Dann soll er den Schlüssel durch Betätigen der OK-Schaltfläche bestätigen. Ist die Kombination aus E-Mail und Freigabeschlüssel korrekt, sollen die beiden Informationen in der Tabelle tblOptionen gespeichert werden. Beim nächsten Aufruf der Anwendung sollen diese beiden Werte dann beim Aufruf des Formulars frmStart geprüft werden. Passen diese zusammen, setzt die Anwendung den Startvorgang fort und zeigt das gewünschte Element der Benutzeroberfläche an. Anderenfalls wird der Benutzer gebeten, die korrekten Daten zur Freischaltung anzugeben.

Nachfolgend schauen wir uns mehrere Varianten an, wie wir die E-Mail-Adresse und den Schlüssel erstellen und prüfen können. Die erste Variante ist die zeitlich unbegrenzte, die zweite ist eine, mit der Sie eine Software befristet bis zu einem bestimmten Datum freischalten lassen können.

Einfache Variante: E-Mail und Schlüssel müssen passen

Um die Schlüssel zu generieren, verwenden wir eine Klasse namens clsCrypt des Autors Tim Braun (siehe Modul im VBA-Projekt). Diese bietet vor allen die für uns interessante Funktion namens GetSHA1 an, die eine als Parameter übergebene Zeichenkette in einen Schlüssel umwandelt.

Diese Funktion können wir nach der Initialisierung eines Objekts auf Basis der Klasse clsCrypt wie in der folgenden Prozedur testen:

Public Sub Test_GetSHA1()
     Dim objCrypt As clsCrypt
     Set objCrypt = New clsCrypt
     Debug.Print objCrypt.GetSHA1("André Minhorst")
End Sub

Das Ergebnis lautet dann:

B431123435AE6C58E661FBCA736FAEF739BE6F2F

Der Benutzer wird Probleme haben, daraus zu ermitteln, auf welche Weise der Schlüssel produziert wird. Es sollte natürlich nicht allzu einfach sein – wenn Sie also einfach nur die E-Mail-Adresse verschlüsseln und als Schlüssel zum Freischalten der Anwendung nutzen, besteht die Gefahr, dass der Benutzer sich seine eigenen Schlüssel erstellt.

Zum Erstellen eines einfachen Schlüssels verwenden wir nun die E-Mail-Adresse und hängen eine einfache Zeichenfolge wie etwa xxx an (diese darf natürlich ebenfalls etwas komplizierter ausfallen). Der zu kodierende Ausdruck heißt dann im Falle meiner eigenen E-Mail-Adresse etwa so: andre@minhorst.comxxx

Der verschlüsselte Ausdruck heißt dann:

D382469636E463CE93079D0F9714212EFC4D54A6

Wir wollen uns eine kleine Funktion bauen, um die Schlüssel einfacher herstellen zu können. Diese sieht so aus:

Public Function Verschluesseln(strAusdruck As String)  As String
     Dim objCrypt As clsCrypt
     Dim strVerschluesselt As String
     Set objCrypt = New clsCrypt
     strVerschluesselt = objCrypt.GetSHA1(strAusdruck)
     Verschluesseln = strVerschluesselt
End Function

Im Direktfenster setzen Sie die Funktion wie folgt ein:

  Verschluesseln("andre@minhorst.comxxx")
D382469636E463CE93079D0F9714212EFC4D54A6

Eingabe des Schlüssels

Nun, wo wir eine Methode zum Erzeugen der Schlüssel programmiert haben, wollen wir uns um das Formular zur Eingabe der E-Mail-Adresse und des Schlüssels kümmern. Dazu fügen wir der Schaltfläche cmdOK den Code aus Listing 1 hinzu.

Private Sub cmdOK_Click()
     Dim strEMail As String
     Dim strSchluessel As String
     strEMail = Me!txtEMail
     strSchluessel = Me!txtSchluessel
     If Verschluesseln(strEMail & "xxx") = strSchluessel Then
         SchluesselSchreiben strEMail, strSchluessel
         MsgBox "Die Anwendung wurde erfolgreich freigeschaltet."
         DoCmd.Close acForm, Me.Name
     Else
         MsgBox "E-Mail-Adresse und/oder Schlüssel sind nicht korrekt."
     End If
End Sub

Listing 1: Prüfung des Schlüssels

Die Ereignisprozedur cmdOK_Click trägt die Werte der beiden Textfelder txtEMail und txtSchluessel in die beiden Variablen strEMail und strSchluessel ein. Dann prüft sie in einer If…Then-Bedingung, ob der verschlüsselte Wert der E-Mails-Adresse plus der angehängten Zeichenkette xxx mit der vom Benutzer eingegebenen Schlüssel-Zeichenfolge übereinstimmt. Ist dies der Fall, ruft die Prozedur die Funktion SchluesselSchreiben auf und übergibt die E-Mail und den Schlüssel an diese Funktion. Es erscheint eine Meldung, welche die erfolgreiche Freischaltung bestätigt und das Formular wird geschlossen.

Hat der Benutzer nicht die richtige Kombination aus E-Mail-Adresse und Schlüssel eingegeben, erscheint ebenfalls eine Meldung und das Start-Formular bleibt geöffnet. Er kann es nun erneut probieren oder aber mit einem Klick auf die Schaltfläche cmdBeenden die Anwendung schließen.

Schreiben von E-Mail und Schlüssel

Die von der oben beschriebenen Prozedur aufgerufene Funktion SchluesselSchreiben erwartet die E-Mail-Adresse sowie den Schlüssel als Parameter (siehe Listing 2). Die Funktion prüft, ob sich bereits ein Datensatz in der Tabelle tblOptionen befindet. Falls nicht, fügt sie einen neuen Datensatz hinzu und trägt die beiden Werte aus den Parametern strEMail und strSchluessel in die beiden Felder der Tabelle ein. Ist bereits ein Datensatz vorhanden, werden die Inhalte der beiden Felder durch die neuen Werte ersetzt.

Private Sub SchluesselSchreiben(strEMail As String, strSchluessel As String)
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblOptionen", dbOpenDynaset)
     If rst.EOF Then
         rst.AddNew
         rst!EMail = strEMail
         rst!Schluessel = strSchluessel
         rst.Update
     Else
         rst.Edit
         rst!EMail = strEMail
         rst!Schluessel = strSchluessel
         rst.Update
     End If
End Sub

Listing 2: Schreiben des Schlüssels

Die Tabelle sieht danach etwa wie in Bild 6 aus.

Tabelle mit den Freischaltungsdaten

Bild 6: Tabelle mit den Freischaltungsdaten

Inhalt der Tabelle beim öffnen prüfen

Nun haben wir allerdings nur den Fall abgedeckt, dass der Benutzer die Anwendung zum ersten Mal öffnet. Wenn er nun eine gültige Kombination aus E-Mail-Adresse und Schlüssel angegeben hat, soll er ja nicht bei jedem erneuten öffnen der Anwendung erneut die Daten eingeben müssen. Also wollen wir die Prozedur cmdOK_Click so erweitern, dass diese zunächst prüft, ob bereits gültige Daten in der Tabelle tblOptionen vorliegen.

Dazu fügen wir der Ereignisprozedur, die durch das Ereignis Beim öffnen ausgelöst wird, die folgenden Anweisungen hinzu:

Private Sub Form_Open(Cancel As Integer)
     If SchluesselPruefen = True Then
         Cancel = True
     End If
End Sub

Wenn die Funktion SchluesselPruefen den Wert True zurückliefert, stellt die Prozedur den Wert des Parameters Cancel auf True ein. Dies führt dazu, dass das Formular frmStart direkt wieder geschlossen wird.

Es fehlt nun noch die Funktion SchluesselPruefen. Diese Funktion finden Sie in Listing 3. Die Funktion erwartet keine Parameter, da sie die zu prüfenden Werte direkt aus der Tabelle tblOptionen einliest. Auch hier kann es wieder sein, dass noch gar kein Datensatz in der Tabelle gespeichert ist. Dies prüft die Prozedur gleich in der ersten If…Then-Bedingung mit dem Ausdruck rst.EOF. Liefert dies True, enthält die Tabelle noch keinen Datensatz. In diesem Fall soll die Funktion den Wert False zurückliefern.

Private Function SchluesselPruefen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim strEMail As String
     Dim strSchluessel As String
     Dim bolSchluesselPruefen  As Boolean
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblOptionen", dbOpenDynaset)
     If Not rst.EOF Then
         strEMail = rst!EMail
         strSchluessel = rst!Schluessel
         If Verschluesseln(strEMail & "xxx") = strSchluessel Then
             bolSchluesselPruefen = True
         Else
             bolSchluesselPruefen = False
         End If
     Else
         bolSchluesselPruefen = False
     End If
     SchluesselPruefen = bolSchluesselPruefen
End Function

Listing 3: Prüfen, ob der in der Tabelle tblOptionen gespeicherte Schlüssel korrekt ist

Ist hingegen bereits ein Datensatz vorhanden, liest die Prozedur die beiden Werte der Felder EMail und Schluessel in die Variablen strEMail und strSchluessel ein.

In einer weiteren If…Then-Bedingung prüft die Funktion dann, ob der mit der Funktion Verschluesseln verschlüsselte Ausdruck aus der E-Mail-Adresse und der Zeichenkette xxx dem Schlüssel aus strSchluessel entspricht. Ist dies der Fall, erhält die Variable bolSchluesselPruefen den Wert True, anderenfalls den Wert False.

Wenn der Benutzer nun einmalig die richtige Kombination aus E-Mail-Adresse und Schlüssel eingegeben hat, wird das Formular frmStart erst gar nicht geöffnet – der Vorgang endet bereits in der Prozedur, die durch das Ereignis Beim öffnen ausgelöst wird.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar