Lizensierung so gut gelößt?

  • Lizensierung so gut gelößt?

    Hi,

    ich habe jetzt eine Lizensierung in meine App gebaut und wollte mal fragen ob Ihr das so gut findet.

    Beim Start schaut die App nach ob in den UserDefaults ein Key "LicenseKey" existiert. Dieser Key setzt sich zusammen aus

    "Lizenzversion der Software"+"Ablaufdatum der Lizenz"+"MacAddress zu der Lizenz"+"SHA-256 Hash"

    Der Hash bildet sich aus dem Lizenzversion, Datum, MacAdresse und einem internen SecretKey.

    Ist der Key vorhanden wird einfach nachgesehen ob das Ablaufdatum überschritten ist. Bei einer unbegrenzten Laufzeit wird einfach 0 als Ablaufdatum angegeben und die Versionsnummer überprüft (Ist die Versonsnummer der App höher als die für die der Key erstellt wurde, wird die App auch beendet)

    Ist kein Key vorhanden oder der Key in den UserDefaults ist invalid (durch Mainpulationen z.B.) dann wird die MacAddresse und Appversion an meinen Server gesendet. Gibt es keine Verbindung kommt ein entsprechendet Request und die App wird beendet.

    Der Server schaut nun in seiner DB ob es schon einen Eintrag zu der MacAddresse gibt.
    Wenn nein, dann wird ein neuer Eintrag erzeugt und das Aktuelle Datum + 30 Tage in das Feld licenseend geschrieben und vom Script zurück gegeben. Die App schaut nach ob das zurückgegebe Datum in der Zukunft liegt und erzeugt daraus dann den Lizenzkey nach obigem Motto und schreibt den in die UserDefaults.
    Wird ein Eintrag gefunden, dann wird der Eintrag aus dem Feld licenseend und licenseversion zurück gegeben und die App erzeugt daraus den Eintrag in den UserDefaults falls das Datum noch in der Zukunft liegt. Ansonsten gibt es halt wieder einen entsprechenden Requester und die App beendet sich.

    Aus diese Art und Weise kann ich sowohl zeitlich begrenzte Lizenzen vergeben als auch zeitlich unbegrenzte, die aber nur für bestimmte Versionen der Software gilt.

    Ist das ein gutes Konzept ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Hallo,

    … kurz umrissen mache ich Folgendes:

    - FileMaker Datenbank, die Kundeninformationen aufnimmt und die zu erstellende Lizenz konfigurieret wird
    - diese Datenbank werfe ich in einen Ordner mit dem Mutterordner des Xcode Projekts
    - in dem Xcode Projekte gibt es an unterschiedlichen Codestellen die Lizenzinformationen, die als solches vorab leer sind

    In der Filemaker Datenbank gibt es ein Knopf, der die in der Datenbank hinterlegten Lizenzinformationen in die Textdateien des Xcode Projekt schreibt und dann das Release kompiliert.
    Dieses wird in ein zip Archiv gepackt und via Email versandt. Alles voll automatisch mit Protokollfunktion.
    Somit erstelle ich für jeden Kunden eine eigene Version.

    Zeitlich begrenzte Versionen kann ich ebenfalls erstellen.
    Beim Öffnen der Anwendung werden z.B. das Änderungsdatum der Systemlogs geprüft, ein Header-Request an einen Server gesandt etc.

    Somit kann der Anwender nur aufwändig bescheißen. Sicher ist das natürlich alles nicht, aber meines Erachtens eine große/größere Hürde.
    Wer betrügen will, der kann das eh immer irgendwie. Deshalb würde ich da nicht so viel Zeit investieren.
    Diese Leute wären eh nicht die Kunden, die wir gewinnen würden.

    Viele Grüße

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von little_pixel ()

  • Hast du sichergestellt, dass die Systemzeit nicht einfach zurückgestellt werden kann?

    Genau solche Sachen habe ich damals explizit "erlaubt".
    In der heutigen Zeit hat das Umstellen des Systemdatums so viele Auswirkungen (Kalender etc.), dass das niemand freiwillig macht.

    Natürlich ist das schnell rausgekommen und manche Leute haben sich gefreut.
    Kurze Zeit später kamen die Bestellungen, da Systemdatum umstellen total plöhte ist, da so viele Dinge nicht mehr richtig funktionieren.

    Super Werbung…

    Viele Grüße
  • DroneDeveloper schrieb:

    @Thallius
    Hast du sichergestellt, dass die Systemzeit nicht einfach zurückgestellt werden kann?


    Indirekt ja. Man kann in das flugbuch keine flüge importieren die in der Zukunft liegen. Dadurch wird es unmöglich neue flüge zu importieren wenn man das Systemdatum zurück stellt.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Vielleicht ist es besser, den Text (MAC, Datum) vom Server signieren zu lassen. Dann brauchts in der Anwendung nur den Public Key vom Server zum Prüfen. Andernfalls müsste ich ja nur den "geheimen" Key aus der Anwendung fischen und kann beliebig Lizenz-Files erstellen, ohne die Anwendung anfassen zu müssen.

    Oh, und wenn Dir reines Hashen reicht, nimm wenigsten HMAC. Begründung u.a. en.wikipedia.org/wiki/Length_extension_attack
    C++
  • Mittels einer man in the middle Attacke Liese sich die Antwort von Server abfangen und ein Datum 3000 Jahre in der Zukunft einstellen das von deiner App für valide erklärt werden würde.. Aber keine Ahnung in wie weit du das Programm sichern willst
  • Ähm, ja das habe ich vergessen zu erwähnen. Zu den Parametern und Rückgabewerten die über das Netz gehen gibt es natürlich auch immer einen Hash so das die nicht so einfach geändert werden können.

    @Zerm

    Das mit dem Public Key verstehe ich nicht. Was ist denn jetzt der Unterschied ob ich meinen SecretKey im Code habe oder den PulbicKey? Sobald der Hacker eins von beidem findet und den richitgen Hash Algorhythmus dazu kann er machen was er will oder nicht?

    HMAC kann ich auch nehmen. Das ist ja dann nur ein anderer Funktionsaufruf.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Nein, wenn ich den Hash/HMAC Key aus Deiner Anwendung rausziehe, kann ich damit dann gültige Lizenz-Files erstellen.
    Wenn ich den public key aus der Anwendung ziehe, kann ich nur selber gültige Lizenz-Files überprüfen, aber nicht erstellen. Dafür brauch ich ja den private key, und der bleibt immer auf Deinem Server. Also nicht hashen, sondern richtig signieren. Wie iOS/OSX Anwendungen ;)
    C++
  • zerm schrieb:

    Nein, wenn ich den Hash/HMAC Key aus Deiner Anwendung rausziehe, kann ich damit dann gültige Lizenz-Files erstellen.
    Wenn ich den public key aus der Anwendung ziehe, kann ich nur selber gültige Lizenz-Files überprüfen, aber nicht erstellen. Dafür brauch ich ja den private key, und der bleibt immer auf Deinem Server. Also nicht hashen, sondern richtig signieren. Wie iOS/OSX Anwendungen ;)

    Dann muss man aber auch Vorkehrungen treffen dass der public key nicht ausgetauscht werden kann.

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Mach es nicht zu kompliziert. Das erhöht nur den Supportaufwand. Was meinst du was passiert wenn sich jemand am Samstag noch schnell einen neuen Rechner kauft und das Programm läuft nicht? Wir hatten die MAC in der Lizenz bis meine Mutter 2 mal Nachts aus dem Bett geklingelt wurde weil ein erboster Kunde Support haben wollte. Ich stand nicht im Telefonbuch ;)
    Kunden wollen anonym Testen. Wenn du dann irgendwelche Testlizenzen oder Downloadkeys rumschickst baust du dir nur eine Datenbank mit falschen Adressen auf.
    Schreib das Datum an ein paar Stellen im System und gut ist. Prefereces/.GlobalPreferences.plist, Prefereces/ByHost7.GlobalPreferences.plist, irgendwelche .Dateien im Homeverzeichnis, Extendet Attributes sind nur ein paar Beispiele.
    Wenn es nach dem Test einer kauft bekommt er die Lizenz und dann hast du auch seinen Namen.
    Kannst ja noch eine Abfrage programmieren ob die gleiche Lizenz im lokalen Netz vorkommt und darauf reagieren.
    Und schau dir mal AquaticPrime an. Thomas Tempelmann hat da was dazu geschrieben.


    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • @zerm

    achso richtig signieren. Ehrlich gesagt wird es mir da dann zu aufwendig um den Nutzen. Wie wir ja alles wissen ist jeder Schutz nur eine Aufwands-Abschätzung.
    Da die Software nur für einen ganz kleinen Userkreis interessant ist (Also es gibt z.b. nur ca. 30000 lizensierte Piloten in Deutschland wovon vlt 10% aktiv fliegen und davon dann ca. 30% einen Mac haben (Erstaunlicherweise ist der Macanteil unter uns Fliegern sehr hoch, bzw wird immer höher in den letzten Jahren)) und man sich in der Szene dadurch natürlich auch kennt, denke ich ist die Hemmschwelle allein schon moralisch höher als bei einem Spiel oder Photoshop. Ich glaube mit dem Hashen das ist schon genug. Wenn tatsächlich jemand den secretKey rauszieht und sich den richtigen Algorhythmus sucht, dann bitte. Aber ich denke das spricht sich dann auch schnell rum und ich kann einfach einen neuen Has oder/oder key einbauen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Dazu kommt dann noch wie viele von dieser Zielgruppe technisch so versiert sind das sie sich den Aufwand machen, zu versuchen das Ding zu knacken.
    Ich denke für deinen Gebrauch ist deine Lösung adäquat und bietet genug an Sicherheit.