Lizenzschlüssellösung in Webanwendungen - was ist der beste Ansatz?


14

Ich bin ratlos über eine Anfrage meines Managers. Ich arbeite für ein kleines Startup und wir entwickelten eine Webanwendung für einen festen Tarif mit einem Wartungsvertrag für ein VIEL größeres Unternehmen. In Kenntnis von Horrorgeschichten darüber, wie große Unternehmen ihre Rechnungen nur bis zur letzten Sekunde bezahlen, haben wir uns entschlossen, uns zu schützen, indem wir diese Webanwendung so lizenzieren können, dass die Software nicht mehr funktioniert, wenn wir nicht bezahlt werden.

Ich habe dies bereits für Desktop-Anwendungen gesehen, es handelt sich jedoch um eine Webanwendung, die intern gehostet wird und nicht über das Internet zugänglich ist.

Was ist der beste Ansatz, um dies zu tun, wir möchten, dass es einen kleinen Platzbedarf hat und die Möglichkeit, den Lizenzschlüssel, den sie verteilt haben, zu erneuern.

Hat jemand etwas Ähnliches gemacht? Sind wir völlig verrückt? Hat jemand bessere Vorschläge?


Um dies richtig zu machen, werden Sie eine Menge Zeit brauchen (oder sie werden es einfach brechen). Es ist viel billiger, ein Produkt zu kaufen, das Java-Programme schützt. Andernfalls erstellen Sie aus der Lizenz ein Java-Bytecode-Snippet, das vom Programm gelesen und anschließend aktualisiert wird.

Davor hatte ich Angst, ich werde nach Lösungen von Drittanbietern suchen, aber wir sind bereits schmerzlich überbewertet.
maple_shaft

Dann machen Sie es einfach schmerzhaft langsam, 2 Wochen nachdem die Zahlung fällig ist.

@ Thorbjørn, LOL !! ^ _ ^ So verlockend dieses Projekt auch sein mag, es ist ein Verlustführer, zusätzliche Geschäfte mit diesem Unternehmen zu machen. DIE HÖCHSTE QUALITÄT ist von höchster Wichtigkeit. Gleichzeitig wollen wir nicht komplett durchdrehen, während wir nach dem Honigtopf suchen.
maple_shaft

@ Maple, klingt nach einem schlechten Geschäftsplan. Überlassen Sie das Geld dann den Buchhaltern und ziehen Sie nicht in Betracht, Malware zu liefern.

Antworten:


9

Es gibt viele Möglichkeiten, um so etwas zu implementieren, aber hier ist eine, die nicht zu schwierig sein sollte:

Sie benötigen eine öffentlich zugängliche Website, auf der eine Datei mit den Hashes der Lizenzschlüssel gehostet wird, die auf die schwarze Liste gesetzt wurden. Wie Sie diese Datei verwalten, bleibt Ihnen überlassen, aber die Datei selbst muss nur einen Hash pro Zeile enthalten.

Anschließend initiiert Ihre Software in regelmäßigen Abständen einen Download dieser Datei (in den meisten serverseitigen Sprachen ist dies vorgesehen) und durchsucht sie anschließend nach dem Hash des installierten Lizenzschlüssels. Wenn es gefunden wird, weiß die Anwendung, dass es abstürzen sollte, bis die schwarze Liste entfernt wird.

Hierfür sollte MD5 oder ähnliches plus ein Geheimnis ausreichen. Sie könnten schicker werden und die Anwendung die Anfrage direkt an Ihre Site senden lassen und sie in einer Datenbank nachschlagen, aber die Datei (für die ich davon ausgehe, dass es sich hoffentlich um eine kurze Liste handelt) würde hoffentlich klein bleiben und möglicherweise klein sein der einfachste Weg.

Der schwierigere Teil wird sein, die Anwendung tot zu halten. Schließlich muss dies irgendwo intern gespeichert werden, was bedeutet, dass es, wenn es zu offensichtlich ist, leicht unterlaufen werden kann, und selbst wenn es nicht zu offensichtlich ist, kann es leicht durch Wiederherstellen der entsprechenden Tabelle (n) wiederhergestellt werden. Datei (en). Deshalb schlage ich auch eine zweite Schutzmethode vor.

Diese Methode würde "LIVE" oder "DEAD" (oder etwas ausreichend Ähnliches) in einer Tabelle oder einer Datei speichern, aber wieder HASHed. Dies muss mit Ihrem Salz UND einem Zeitstempel gehasht werden. Überprüfen Sie diesen Wert jedes Mal, wenn eine Seite in Ihrer Anwendung ausgeführt wird, mit einer gehashten Version von "LIVE" + salt + timestamp und lassen Sie dann einen gültigen Bereich von Zeitstempeln zu (z. B. einen Tag, zwei Tage, eine Woche, einen Monat usw.). Denken Sie daran, je größer die Reichweite, desto schwerer wird die Leistung.). Solange die Dinge übereinstimmen (oder eine Übereinstimmung gefunden wird), ist die App aktiv. Andernfalls ist der Wert in der speziellen Datei oder Tabelle auch dann "LIVE", wenn versucht wird, eine Wiederherstellung von der Sicherung durchzuführen, da der Zeitstempel außerhalb Ihres Schwellenwerts liegt.

Zusammenfassend (dies setzt voraus, dass Sie über eine programmgesteuerte Methode zur Überprüfung der Gültigkeit eines Lizenzschlüssels verfügen , z. B. eine Prüfsumme oder eine andere Methode):

  • CheckBlacklist
    • Konvertieren Sie License Key in Hash mit Salz
    • Blacklist-Datei vom Server anfordern
    • Ist mein Hash in der Datei?
    • Wenn JA, dann speichere Hash von "TOT" + Salz + Zeitstempel (auf den Tag verkürzt; keine Notwendigkeit, Stunden + Tage + Minuten zu speichern)
    • Wenn NEIN, dann speichere Hash von "LIVE" + Salz + Zeitstempel (abgeschnitten)
  • IsKeyAlive
    • Erstellen Sie einen Hash aus "LIVE" + Salt + abgeschnittenem Zeitstempel
    • Laden Sie den DeadAlive-Hash
    • Stimmen sie überein
    • Wenn JA, dann leben wir; return TRUE.
    • Wenn NEIN, sind wir möglicherweise tot, befinden uns aber möglicherweise noch innerhalb unseres Zeitstempelfensters:
      • Subtrahieren Sie einen Tag vom Zeitstempel und wiederholen Sie den Hash.
      • Sind wir uns jetzt einig?
      • JA? Rückgabe TRUE
      • Fügen Sie dem Zeitstempel einen Tag hinzu und wiederholen Sie den Hash
      • Sind wir uns jetzt einig?
      • JA? Rückgabe TRUE
    • Zu diesem Zeitpunkt befinden wir uns außerhalb des Zeitstempelbereichs und haben keine Übereinstimmung. Falsch zurückgeben. (Kill App)

Nun, meine Güte, es gibt eine Million und eine Möglichkeit, wie dies scheitern kann. Berücksichtigen Sie alle möglichen Möglichkeiten und erstellen Sie ein zuverlässiges System (einschließlich eines, bei dem davon ausgegangen wird, dass der Client richtig ist, wenn die Blacklist-Datei nicht heruntergeladen werden kann). Testen Sie, testen Sie, testen Sie es und testen Sie es dann noch einmal, bevor Sie es bereitstellen. Wenn es schief geht, haben Sie das Vertrauen Ihres Kunden verloren.


+1 Für eine episch komplizierte Antwort O_o. Ich kann mich irren, aber ich glaube nicht, dass dies so kompliziert sein muss. Ich vertreibe kein Microsoft Office, dies ist eine benutzerdefinierte Anwendung für einen einzelnen Client. Hier bestehen weiterhin die gleichen Probleme, die auftreten, wenn der Server, auf dem sich diese Anwendung befindet, möglicherweise nicht mit einem externen Dienst kommunizieren kann. Ich verstehe nicht, warum Verschlüsselung, Hashes und Salze hier wirklich notwendig sind. Was wir wirklich wollen, ist ein Kill Switch.
maple_shaft

Danke ;-) Der Grund, warum ich einen Hash vorschlage, ist, dass niemand, der Verkehr schnüffelt und / oder Code / Tabellen / Dateien auf Ihrem Client betrachtet, wissen kann, was in der Welt vor sich geht. Hashes bedeuten nichts, ohne dass beide Seiten dabei sind, und es ist unwahrscheinlich, dass der Client begreift, dass der Hash tatsächlich eine Darstellung seines Lizenzschlüssels ist. (Wenn es im Klartext übertragen würde, würden sie es sofort wissen.) Ebenso wird die Notwendigkeit verringert, Verschlüsselung oder SSL für Ihre Blacklist-Datei durchzuführen - die Hashes bedeuten für sich genommen zip.
Kerri Shotts

Randnotiz: Wenn Sie sicher sind, dass der Client erkennt, dass eine Wiederherstellung bestimmter Tabellen / Dateien zu schwierig ist, können Sie die Komplexität erheblich reduzieren, indem Sie die Prüfung bei jedem Start der App entfernen. Trotzdem würde es nicht allzu lange dauern, um herauszufinden, was los ist und wie man es umgehen kann.
Kerri Shotts

1
CheckBlacklist: license-server.example.com: no route to hostWas nun? Der Lizenzserver kann nicht einmal existiert irgendwann in der Zukunft - und erzählen Sie mir nicht , dass Ihr Unternehmen wird immer noch in zwanzig Jahren noch am Leben sein, die eher statistisch unwahrscheinlich ist.
Piskvor

1
Es gibt viele Möglichkeiten, dies zu umgehen, auch wenn Sie keine eigenen Server verwenden. Benutze Amazon oder Google oder ähnliches. Alternativ können Sie "Vertrauen" in die Prüfung einbauen, damit Benutzer die App weiterhin verwenden können, wenn der Host tot ist. Wie ich in der Post erwähnt habe, kann es auf millionenfache Weise scheitern, und deshalb bin ich wirklich gegen diese Art der Überprüfung. Ich vertraue meinen Kunden lieber, als mir einen solchen Scheck auszudenken. (Ein Lizenzschlüssel für sich allein, werde ich anstreben. Aber es auf die schwarze Liste setzen? Der Aufwand lohnt sich nicht, IMO.)
Kerri Shotts

4

Die anderen Antworten haben bereits gute Arbeit geleistet, um die technische Seite abzudecken. Bitte beachten Sie aber auch die rechtliche Seite.

Hast du überhaupt ein Recht, ihre App zu blockieren, wenn sie nicht bezahlen? Wenn Sie dies nicht im Vertrag erwähnt haben, haben Sie möglicherweise kein Recht, dies zu tun, selbst wenn Zahlungen ausfallen (als ob Sie nicht unbedingt berechtigt wären, etwas zurückzuerobern, das Sie verkauft haben). Außerdem haben viele Länder spezielle Gesetze, die die "Manipulation von Computerprogrammen" verbieten - was Sie tun, könnte als solches angesehen werden und Sie sogar strafrechtlicher Verantwortung aussetzen.

Ich würde daher raten, dies zuerst mit einem Anwalt zu besprechen, um nicht in heißes Wasser zu geraten.

Am Ende ist es vielleicht besser, sich nur auf das Rechtssystem zu verlassen. Wenn sie nicht zahlen, verhandeln Sie, und wenn das nicht hilft, klagen Sie einfach. In vielen Ländern ist Klagen relativ schmerzfrei und billig, wenn die Vertragslage klar ist (in Deutschland erhalten Sie z Klagen bei zB Mahnbescheid für weniger als 20 € bekommen).


Diese Art der Beantwortung meiner Frage, ob wir verrückt sind. Ich hatte jedoch den Eindruck, dass ich keine andere Wahl habe und darauf bestehen meine Vorgesetzten, obwohl dies nicht im Vertrag enthalten ist. Leider lebe und arbeite ich in den USA, wo man kein großes Unternehmen übernehmen kann, auch wenn man recht hat. Sie haben Armeen von Anwälten, die alles in Papierkram lange genug begraben, um uns aus dem Geschäft zu werfen, wenn sie es wirklich wollten.
maple_shaft

Ich bin mit @sleske einverstanden, legale Kanäle zu nutzen. Stellen Sie sicher, dass der Vertrag einwandfrei ist, und verklagen Sie sie, wenn sie gegen die Bestimmungen verstoßen. Oder zumindest zu verklagen drohen. Was ich von großen Unternehmen gesehen habe, sind sie sehr bereit, Lieferanten dafür zu bezahlen, dass sie nicht verklagt werden oder gegen einen Vertrag verstoßen.
RationalGeek

@maple_shaft: Keine Ahnung von der rechtlichen Situation in den USA, aber ich hoffe, die rechtliche Situation ist nicht so aussichtslos, wie Sie es malen. Jedenfalls würde ich Sie nur auf die möglichen Probleme hinweisen, wenn Sie aufgefordert würden, dies umzusetzen. Wenn Sie (natürlich schriftlich) noch die Erlaubnis erhalten, haben Sie alles getan, was Sie können.
sleske

Ein zeitlich begrenztes Lizenzierungssystem, bei dem die App nach Ablauf der Lizenz unbrauchbar wird, ist kein Problem. Viele Unternehmen, ob groß oder klein - Adobe zum Beispiel.
James Snell

2

Inwiefern unterscheidet sich das interne Hosting von anderer Software, die Sie möglicherweise ausliefern? Finden Sie heraus, was Sie tun würden, wenn Sie beispielsweise eine Desktop-Inventar-Anzeigeanwendung ausliefern würden, und tun Sie dies.


Ich glaube, ich bin nur verwirrt darüber, was im Allgemeinen zu tun ist. Ich stelle mir vor, dass die Anwendung eine nächtliche Überprüfung ihres Lizenzschlüssels durch Senden einer Anfrage an einen externen Webserver mit der Lizenznummer durchführen sollte. Die Antwort ist erfolgreich oder fehlgeschlagen und wird in einer Anwendungskontextvariablen gespeichert. Die Anwendung wird im Wesentlichen "ausgeschaltet", wenn der Lizenzschlüssel nicht gültig ist. Auf diese Weise können wir diese Lizenznummer bei Bedarf einfach "ungültig machen".
maple_shaft

Denken Sie, dass diese einfache Lizenzauthentifizierungsseite SSL-verschlüsselt sein sollte? Selbst wenn jemand einen Paketsniffer implementieren und eine gültige Lizenznummer ableiten könnte, müsste er eine verteilte Kopie der Anwendung haben, damit sie nützlich ist, und selbst dann ist sie sehr zweckmäßig aufgebaut. Ich kann mir nicht vorstellen, dass es jemand anderem als meinem direkten Kunden von Nutzen ist.
maple_shaft

1

Das hängt vom System ab. Haben Sie ein bestehendes Framework wie Magneto erweitert oder eine ganze Anwendung von Grund auf neu geschrieben? Wenn es das spätere ist, ist es nicht allzu schwierig, eine Lizenzanforderung einzurichten. Sie liefern die Anwendung nur mit einer kurzfristigen Lizenz, die 45 Tage nach Rechnungsstellung abläuft und später eine dauerhafte Lizenz gibt.

Dies setzt voraus, dass Sie die Quelle nicht auch umdrehen. :)


Wir drehen die Quelle nicht um. Wir werden den Quellcode kontrollieren und bei Bedarf regelmäßige Releases und Bugfixes verteilen.
maple_shaft

1
@maple_shaft: Nun, es besteht immer die Möglichkeit, die Herausgabe von Fixes oder Updates zu verweigern, bis die Rechnung bezahlt wurde, da ich vermute, dass die Wartung entweder in den Erstkauf oder den laufenden Verkauf integriert ist, mit regelmäßigen Zahlungsterminen ( normalerweise, aber nicht immer, jährlich).
Vatine

Um @Vatine weiterzuverfolgen, haben wir für frühere Projekte, für die es an einer starken Lizenzierung mangelte, Mängel als Hebelpunkt für die Extraktion von Zahlungen verwendet. Einige der Mängel waren möglicherweise keine vollständigen Unfälle.
Christopher Bibbs

@maple_shaft - Wenn Sie nur einen einzigen Client haben. Die Lösung ist einfach. Stellen Sie keine Updates für dieses Programm zur Verfügung, es sei denn, der Kontostand beträgt $ 0.
Ramhound

1

Da das System intern gehostet wird, funktionieren viele der oben genannten Lösungen, die die Kommunikation mit einem Remote-Server beinhalten, möglicherweise nicht.

Nehmen Sie stattdessen eine Lizenzdatei mit einem Ablaufdatum in das Projekt auf. Sobald die Systemuhr das Ablaufdatum überschreitet, funktioniert das System nicht mehr. Um die Datei zu sichern, verschlüsseln Sie den Inhalt, um Manipulationen zu verhindern. Wenn der Benutzer zahlt oder um ein weiteres Jahr verlängert, senden Sie ihm eine neue Lizenzdatei.

Beachten Sie, dass der Code bei Verwendung von PHP für den Benutzer leicht zu bearbeiten ist. Unabhängig von der Art der Sicherheit, die Sie eingerichtet haben, kann der Benutzer ihn problemlos aufrufen und entfernen. Wenn Sie ASP.NET oder eine andere kompilierte Sprache verwenden, ist dies kein Problem, da der Code nicht geändert werden kann.


Dies ist ein guter Vorschlag, aber eine gepackte und implementierte Java-Anwendung. Wenn Sie ihnen eine neue Lizenzdatei geben, müssen Sie darauf vertrauen, dass sie diese entweder korrekt in die WAR-Datei einfügen oder eine völlig neue WAR-Datei, die für alle nervig wäre. Sie haben eine Menge Papierkram und mehrere IT-Mitarbeiter, die ihre Existenz in ihrem Unternehmen rechtfertigen müssen, indem sie sich einmischen, wenn eine neue Version einer Drittanbieteranwendung veröffentlicht wird. Ich spiele Ihren Vorschlag nicht herunter, nur damit es der am wenigsten beleidigende Vorschlag ist.
maple_shaft

Ich denke, selbst mit den meisten kompilierten Sprachen wie Java kann ein Glas leicht de kompiliert, aktualisiert, neu kompiliert und dann in den Krieg einbezogen werden. Wie geht man damit um?
Sudarshan

1

(Offenlegung - Ich arbeite für Agilis Software, einen Anbieter von Lizenzmanagersystemen .)

Die effektivste Lösung besteht darin, die automatische Produktaktivierung mit einem Lizenzvertrag zu verwenden. Mit dieser Funktion können Sie:

  • Aktivieren Sie automatisch die Kundenlizenz (en). Zur Aktivierungszeit wird jede Instanz automatisch an die von Ihnen gewählten Parameter des Zielsystems gebunden, und die von Ihnen festgelegten Lizenzlimits werden in Ihrer Anwendung durchgesetzt (z. B. Konfigurieren von Funktionen, Festlegen eines allgemeinen Test- oder Abonnement-Zeitlimits).
  • Legen Sie ein Lease-Intervall fest, das die maximale Gültigkeitsdauer eines Aktivierungsereignisses darstellt. Für Kunden mit verdächtigem Guthaben können Sie dies auf beispielsweise zwei Wochen einstellen. Dies bedeutet, dass Ihre App alle zwei Wochen im Hintergrund automatisch nach Hause telefoniert, um die Lizenz zu verlängern. Wenn die Zahlung überfällig ist, können Sie die Lizenz auf dem gehosteten Server deaktivieren. Auf dem nächsten Telefon zu Hause wird sie nicht mehr ausgeführt.
  • Wenn keine Netzwerkverbindung zum Zielsystem besteht, findet ein Self-Service-Aktivierungsvorgang durch den Benutzer statt, bei dem verschlüsselte Dateien an einem beliebigen Web-Terminal ausgetauscht werden. Wenn sich Ihr Benutzer in dieser Position befindet, möchten Sie möglicherweise das Lease-Intervall verlängern, um die Unannehmlichkeiten für ihn mit Ihrem Zahlungsbedarf abzugleichen. Sobald sie zahlen, können Sie das Mietintervall so lange machen, wie Sie möchten, bis es unbefristet ist.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.