Registrierung von Anwendungen

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.

pic001.png

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).

pic002.png

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).

pic005.png

Bild 4: Prinzipieller Ablauf beim Prüfen und Eingeben der Registrierungsdaten

Bild 4 zeigt den prinzipiellen Ablauf beim Eingeben und Prüfen der Registrierungsdaten.

pic003.png

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

Schreibe einen Kommentar