Android Tutorial Android Anwendung mit der Licensing Library schützen

klaus

Expert
Licensed User
Longtime User
Die Licensing Library erlaubt Ihnen das Android Market Licensing Service zu benutzen um zu prüfen ob der Benutzer die Erlaubniss hat auf Ihre Anwendung zuzugreifen.

Ihre Anwendung sendet eine Abfrage an die lokale Market-Anwendung. Die Market-Anwendung kontaktiert den Market-Server und gibt das Resultat zurück. Das Ergebnis wird, basierend auf den Regeln des Marktes, zwischengespeichert.

Es ist empfohlen die Google Dokumentation über die Licensing Methoden zu lesen:
Application Licensing | Android Developers

Die Licensing Library ist einfach zu konfigurieren. Sie müssen zuerst ein Publisher Account im Markt bekommen.
Ein Klicken auf den 'Edit Profile Link' zeigt eine Seite an, die Ihren Publisher Public Key anzeigt. Diese Seite enthält auch die "test console".
Diese 'test console' erlaubt Ihnen das Resultat zu definieren das vom Server, im Testmodus, zurück gegen weden soll. Der Testmodus erstellt sich, auf Geräten die mit Ihren Publisher Account laufen, automatisch ein.

Die Licensing Library verhindert nicht daß klevere Hacker ihre Anwendung 'hacken', macht es aber schwerer.

Der erste Schritt ist das LicenseChecker Objekt zu initialisieren:

B4X:
Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        Dim lc As LicenseChecker
        Dim p As PhoneId
        lc.Initialize("lc", p.GetDeviceId, publicKey, "kljdflkf".GetBytes("UTF8"))
        lc.SetVariableAndValue("test1", "some secret value")
        lc.CheckAccess
    End If
End Sub
Das Resultat von dem 'licensing Check' wird lokal zwischengespeichert. Der Zwischenspeicher (cache) ist mit dem AES Algorithmus verschlüsselt. Um Benutzer vor Manipulationen mit dem Cache und dem Kopieren des Cache auf verschiedenen Geräten zu vermeiden, wird die Geräte-ID zusammen mit dem Paket-Namen als Paßwort verwendet.

Beachten Sie daß der gleiche Benutzer die Möglichkeit hat Ihre Anwendung auf andere Geräte herunterzuladen, die mit dem gleichen User Account laufen,.

PhoneId (von der Phone Library) benötigt die READ_STATE Erlaubniss (permission). Der Schutz funktioniert auch wenn Sie einen beliebigen String übergeben. Er wird aber schwächer.
Der 'Salt' Parameter sollte ein Array von Bytes sein, mit Zufallswerten (die Werte sollten aber bei jedem Lauf gleich sein).
Der nächste Schritt ist [FONT=&quot]lc.CheckAccess[/FONT] aufzurufen. Dies ruft wiederum die Markt Anwendung oder den lokalen Cache und überprüft, ob der Benutzer berechtigt ist, auf das Programm zuzugreifen.
Eines der folgenden Ereignisse (events) wird ausgelöst, wenn das Ergebnis eintrifft: [FONT=&quot]Allow[/FONT], [FONT=&quot]DontAllow[/FONT] oder [FONT=&quot]Error(ErrorCode As String)[/FONT].
Es liegt an Ihnen, die Eventsubroutinen nach Bedarf zu behandeln.

LicenseChecker.SetVariableAndValue
Eine einfache Möglichkeit eine Anwendung zu 'hacken' besteht darin den Prüfungscode (checking code) zu überspringen. Ein Hacker könnte, zum Beispiel, [FONT=&quot]CheckAccess[/FONT] wegnehmen und anstatt Ihre [FONT=&quot]Allow[/FONT] Eventroutine aufrufen. Um Dieses etwas schwerer zu machen können Sie [FONT=&quot]LicenseChecker.SetVariableAndValue[/FONT] aufrufen.
Zum Beispiel:

B4X:
lc.SetVariableAndValue("test1", "some secret value")
Der obige Code wird den Wert von einer Prozess globalen String-Variable in der Main.Activity, mit dem Namen [FONT=&quot]test1[/FONT], auf "some secret value " setzen, wenn die Prüfung erfolgreich war. Sie sollten den Wert von [FONT=&quot]test1[/FONT] nicht in der [FONT=&quot]Allow[/FONT] Eventroutine benutzten weder testen, denn das wäre zu offensichtlich. Stattdessen sollten Sie es später in Ihrem Programm verwenden.
Sie können kreativ sein und übergeben Sie den Namen der Variablen oder den Wert mit BytesToString oder auf andere Weise.

Ein kompletteres Beispiel:

B4X:
Sub Process_Globals
    Dim publicKey As String
    publicKey = "MIIBIjANBgkqhAADSFEFEFkiG9w0BfW/cGhTbtIs6QIDAQAB..."
    Dim test1 As String
End Sub
Sub Globals

End Sub
Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        Dim lc As LicenseChecker
        Dim p As PhoneId
        lc.Initialize("lc", p.GetDeviceId, publicKey, "kljdflkf".GetBytes("UTF8"))
        lc.SetVariableAndValue("test1", "some secret value")
        lc.CheckAccess
    End If
End Sub
Sub lc_Allow
    Log("Allow")
End Sub
Sub lc_DontAllow
    Log("DontAllow")
    ToastMessageShow("Closing application.", True)
    Activity.Finish
End Sub
Sub lc_Error (ErrorCode As String)
    Log("error: " & ErrorCode)
    ToastMessageShow("Closing application.", True)
    Activity.Finish
End Sub
Sub Activity_Pause(UserClosed As Boolean)
    
End Sub
Sub Activity_Resume

End Sub
Die Library befindet sich hier: http://www.b4x.com/forum/addit...g-library.html

Das Englische Originaltutorial.
 

Davidxyz

Member
Licensed User
Longtime User
Testen

:sign0085: :sign0087:
Sehr geehrter Klaus,
vielen Dank für diesen Beitrag. Ich habe den Quellcode kopiert und meinen "Schlüssel" eingesetzt. Ich habe dazu eine kurze Frage:
wie kann ich die Lizenzierung vorab testen ob das ganze mit Google funktioniert.
(Momentan habe ich die nur als Antwort: "DontAllow".
Viele Grüße und Danke
David
 

klaus

Expert
Licensed User
Longtime User
Ich habe in diesem Bereich leider keine Erfahrung.
Ich habe 'nur' dieses Tutorial von Englisch in Deutsch übersetzt.
Aber vielleicht hat ein anderer Anwender mehr Erfahrung.
Ansonsten, falls Du keine konkrete Antwort bekommst, versuche die Frage im Englischen Forum zu stellen.

Beste Grüsse.
 

Quillok

Member
Licensed User
Longtime User
:sign0085: :sign0087:
Sehr geehrter Klaus,
vielen Dank für diesen Beitrag. Ich habe den Quellcode kopiert und meinen "Schlüssel" eingesetzt. Ich habe dazu eine kurze Frage:
wie kann ich die Lizenzierung vorab testen ob das ganze mit Google funktioniert.
(Momentan habe ich die nur als Antwort: "DontAllow".
Viele Grüße und Danke
David

Hi, ich spiele auch gerade damit herum und hatte bis eben auch immer nur "DontAllow".
Man muss die APK vorher auch bei GooglePlay hochladen, aktiviert muss sie noch nicht sein, und nun bekomme ich auch ein "Allow" :)

*Edit* Merkwürdigerweise funktioniert es jetzt nicht mehr nachdem ich die App veröffentlicht habe?!
 
Last edited:
Top