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.
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.
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).
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.
Bild 4: Anzeige des Startformulars
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.
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