Wenn Sie eine Anwendung programmieren und später als Lösung verkaufen möchten, müssen Sie auf irgendeine Weise sicherstellen, dass nur der jeweilige Käufer damit arbeiten kann. Anderenfalls passiert es leicht, dass dieser die Anwendung an andere Nutzer weitergibt – vielleicht sogar ohne das Bewusstsein, dass er den Hersteller der Software um seinen Lohn bringt. In diesem Beitrag stellen wir Ihnen eine Lösung vor, mit der Sie Ihre Anwendungen vor der Weitergabe an Dritte schützen – und das sogar mit zeitlicher Begrenzung.
Bei der in diesem Beitrag beschriebenen Lösung gehen wir zunächst davon aus, dass der Benutzer sich eine Anwendung aus dem Internet herunterlädt oder diese per E-Mail von Ihnen erhält.
Nach der Installation soll die Anwendung beim ersten Start prüfen, ob der Benutzer einen Satz von Registrierungsdaten eingegeben hat, die aus einem Benutzernamen und einem Registrierungsschlüssel bestehen.
Ist dies geschehen und sind die Registrierungsdaten gültig, sollen diese Daten irgendwo in der Anwendung gespeichert werden und die Anwendung starten.
Bei jedem folgenden Aufruf liest die Anwendung die gespeicherten Registrierungsdaten automatisch aus und bricht den Start entweder ab oder führt die Anwendung aus – je nachdem, ob die Registrierungsdaten noch gültig sind.
Bindung des Registrierungsschlüssels an den Benutzernamen
Damit der Registrierungsschlüssel nicht von beliebigen Benutzern verwendet werden kann, wird dieser mindestens auf Basis des Benutzernamens erstellt. Für die Verschlüsselung des Namens und somit die Erstellung des Registrierungsschlüssels verwenden wir die in der Klasse clsCrypt enthaltenen Algorithmen etwa zum Berechnen eines SHA1-verschlüsselten Ausdrucks (Quellenangabe siehe Beispieldatenbank).
SHA steht für Secure Hash Algorithm. Dieser Algorithmus soll einen eindeutigen Prüfwert etwa für eine Zeichenkette liefern, also einen Wert, der vom Inhalt der Zeichenkette abhängt.
Wenn Sie also sicherstellen möchten, dass die Anwendung nur von einem Benutzer verwendet wird, der als Benutzername seinen Namen und als Registrierungsschlüssel den Hash-Wert einsetzt, brauchen Sie nur einen solchen Wert zu berechnen und später beim Start der Anwendung zu prüfen, ob die Kombination dieser beiden Werte zusammenpasst.
Den Aufruf der Methode GetSHA1 dieser Klasse haben wir wie in Listing 1 im Modul mdlTools gekapselt.
Listing 1: Aufruf der Verschlüsselungsfunktionen der Klasse clsCrypt
Public Function GetSHA1(strKey As String) As String Dim objCrypt As New clsCrypt Dim strSHA1 As String strSHA1 = objCrypt.GetSHA1(strKey) GetSHA1 = strSHA1 Set objCrypt = Nothing End Function
Im Direktfenster testen Sie diese Funktion etwa so:
GetSHA1("Klaus Müller") 04538C3BBD1B721D87F6570B577D1D0A3E7390AD
Angenommen, Sie hätten einem Klaus Müller diese Kombination aus Benutzername und Registrierungsschlüssel geschickt, muss er diese beim ersten Start einer Anwendung eingeben.
Die Kombination wird dann irgendwo in der Datenbank gespeichert, damit der Benutzer diese beim nächsten Start nicht erneut eingeben muss. Dies könnte beispielsweise in einer eigens dafür eingerichteten Tabelle geschehen. Diese nennen Sie tblRegistrierung und legen die beiden Felder Benutzername und Registrierungsschluessel an, sodass die Tabelle wie in Bild 1 aussieht.
Bild 1: Tabelle zum Speichern der Benutzerdaten
Formular beim Öffnen anzeigen
Nach dieser Vorbereitung benötigen wir einen Ort, an dem wir die Prüfung der Benutzerdaten durchführen – sofern diese überhaupt bereits vorliegen. Dafür legen Sie ein Formular an, das an die Tabelle tblRegistrierung gebunden ist und den Namen frmStart erhält. Legen Sie dieses Formular in den Access-Optionen als Startformular fest, sodass dieses gleich nach dem Start der Anmeldung erscheint.
Das Formular enthält vier Steuerelemente: zwei Textfelder namens txtBenutzername und txtRegistrierungsschluessel, die an die beiden Felder der Datenherkunft gebunden sind, sowie zwei Schaltflächen namens cmdOK und cmdAbbrechen (s. Bild 2).
Bild 2: Formular zur Eingabe der Benutzerdaten
Die Schaltfläche cmdAbbrechen soll die Eingabe der Benutzerdaten abbrechen und die Anwendung schließen. Dafür hinterlegen Sie für diese Schaltfläche die folgende Prozedur:
Private Sub cmdAbbrechen_Click() DoCmd.Quit End Sub
Stellen Sie außerdem die Eigenschaft Abbrechen der Schaltfläche auf den Wert Ja ein. Dies sorgt dafür, dass die Anwendung auch beim Betätigen der Escape-Taste geschlossen wird. Das Prüfen der Benutzerdaten erledigt eine kleine Funktion namens BenutzerdatenPruefen (s. Listing 2).
Listing 2: Prüfung der Benutzerdaten
Private Function BenutzerdatenPruefen() As Boolean BenutzerdatenPruefen = (GetSHA1(Nz(Me!txtBenutzername)) = Nz(Me!txtRegistrierungsschluessel)) End Function
Die Funktion ermittelt den Hash-Wert des Benutzernamens und vergleicht diesen mit dem für den Registrierungsschlüssel angegebenen Wert. Stimmen beide überein, liefert die Funktion den Wert True zurück.
Beim Öffnen des Formulars wird diese Funktion erstmalig aufgerufen. Dazu legen Sie für das Ereignis Beim Laden des Formulars die folgende Prozedur an:
Private Sub Form_Load() If BenutzerdatenPruefen Then DoCmd.Close acForm, Me.Name DoCmd.OpenForm "frmMain" End If End Sub
War die Prüfung erfolgreich, schließt die Prozedur einfach das aktuelle Formular und öffnet ein weiteres Formular namens frmMain, das beispielsweise dem Hauptformular der Anwendung entspricht. Sie können natürlich auch einfach das Formular schließen und die verfügbaren Funktionen in der Menüleiste oder im Ribbon anzeigen.
Stimmen der Hash-Wert des Benutzernamens und der Registrierungsschlüssel nicht überein, bleibt das Formular einfach geöffnet. Der Benutzer hat dann die Gelegenheit, die Benutzerdaten einzugeben. Die Eingabe beendet der Benutzer mit einem Klick auf die Schaltfläche OK, was die folgende Prozedur auslöst:
Private Sub cmdOK_Click() If BenutzerdatenPruefen Then DoCmd.Close acForm, Me.Name DoCmd.OpenForm "frmMain" Else MsgBox "Falsche Benutzerdaten." End If End Sub
Hier erfolgt die gleiche Prüfung wie beim Laden des Formulars. Im Erfolgsfall wird das Formular geschlossen und frmMain geöffnet. Stimmt die Kombination aus Benutzername und Registrierungsschlüssel nicht, erscheint eine Meldung mit dem Text Falsche Benutzerdaten. Der Benutzer kann dann erneut seine Daten eingeben oder mit einem Klick auf Abbrechen die Anwendung beenden (s. Bild 3).
Bild 4: Prinzipieller Ablauf beim Prüfen und Eingeben der Registrierungsdaten
Bild 4 zeigt den prinzipiellen Ablauf beim Eingeben und Prüfen der Registrierungsdaten.
Bild 3: Beim Eingeben falscher Benutzerdaten erscheint eine Meldung.
Anwendung schützen
Die bisherigen Bemühungen helfen nun natürlich nicht weiter, wenn Sie den Benutzer nicht vom Einsehen des Quellcodes abhalten. Dazu erstellen Sie aus der .mdb– oder .accdb-Anwendung eine .mde– oder .accde-Datenbank mit geschütztem Code und mit gesperrten Entwurfsansichten.
Der Benutzer kann den Mechanismus zum Prüfen der Benutzerdaten dann nicht einsehen und diesen nicht einfach reproduzieren, um selbst Zugangsdaten zu erzeugen.
Umgehen der Registrierung verhindern
Natürlich könnte der Benutzer einfach direkt auf die übrigen Formulare der Anwendung zugreifen, indem er diese über das Datenbankfenster oder den Navigationsbereich öffnet. Die Anzeige dieser Bereiche lässt sich zwar auch unterbinden, aber ein erfahrener Access-Entwickler kann diese dennoch anzeigen. Außerdem wäre hierfür der Einsatz des Sicherheitssystems erforderlich, was aber ab Access 2007 offiziell nicht mehr unterstützt wird.
Da wir den Entwurf und den Code von Formularen, Berichten und Modulen aber ohnehin schützen, können wir auch gleich einen Mechanismus in die Formulare einbauen, der vor dem Öffnen die Benutzerdaten prüft. Dies erreichen Sie beispielsweise durch eine ähnliche Prüfung wie im Startformular. Damit das Formular nicht geöffnet wird, wenn keine gültigen Benutzerdaten vorliegen, legen Sie die folgende Prozedur für das Ereignis Beim Öffnen des Formulars an:
Private Sub Form_Open(Cancel As Integer) Cancel = BenutzerdatenGueltig End Sub
Die Prüfung der Benutzerdaten haben wir derweil in eine eigene Funktion ausgegliedert, die sich im Modul mdlTools befindet (s. Listing 3).
Listing 3: Abgleich von Benutzername und Registrierungsschlüssel
Public Function BenutzerdatenGueltig() As Boolean Dim strBenutzername As String Dim strRegistrierungsschluessel As String strBenutzername = Nz(DLookup("Benutzername", "tblBenutzerdaten")) strRegistrierungsschluessel = Nz(DLookup("Registrierungsschluessel", "tblBenutzerdaten")) If Not GetSHA1(strBenutzername) = strRegistrierungsschluessel Then BenutzerdatenGueltig = True End If End Function
Die Prozedur Form_Open prüft nun mithilfe der Funktion BenutzerdatenGueltig, ob die Tabelle tblBenutzerdaten einen gültigen Satz von Benutzerdaten enthält. Falls nicht, liefert BenutzerdatenGueltig den Wert False zurück, der gleich dem Parameter Cancel der Prozedur Form_Open übergeben wird. Dies bedeutet, dass der Öffnen-Vorgang des Formulars gleich unterbrochen und das Formular nicht geöffnet wird. Eine solche Prüfung müssten Sie zumindest den wichtigsten Formularen zuweisen, um die Anwendung ohne gültige Benutzerdaten unbenutzbar zu machen.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo