Rozwiązanie klucza licencyjnego w aplikacji internetowej, jakie jest najlepsze podejście?

14

Martwi mnie prośba mojego kierownika. Pracuję dla małego startupu i opracowaliśmy aplikację internetową o stałej stawce z umową serwisową dla DUŻEJ firmy. Znając horrory o tym, jak duże firmy będą płacić rachunki tylko do ostatniej sekundy, zdecydowaliśmy, że chcielibyśmy się zabezpieczyć, mogąc licencjonować tę aplikację internetową w taki sposób, że jeśli nie otrzymamy zapłaty, oprogramowanie nie będzie już działać.

Widziałem to wcześniej w przypadku aplikacji komputerowych, jednak będzie to aplikacja internetowa, którą będą hostować wewnętrznie i nie będą dostępne z Internetu.

Jak najlepiej to zrobić, chcielibyśmy, aby miał mały ślad i chcielibyśmy odnowić dystrybuowany klucz licencyjny.

Czy ktoś zrobił coś podobnego? Czy całkowicie oszaleliśmy? Czy ktoś ma jakieś lepsze sugestie?

wałek klonowy
źródło
Aby zrobić to poprawnie, będziesz potrzebował DUŻO czasu (lub po prostu go złamią). O wiele tańsze jest kupowanie produktu zaprojektowanego do ochrony programów Java. W przeciwnym razie wystarczy uczynić licencję fragmentem kodu bajtu java, który program czyta, a następnie działa upton.
Właśnie się tego obawiałem, przyjrzę się rozwiązaniom innych firm, ale już teraz boleśnie przepełnia nas budżet.
wałek klonowy
Następnie po prostu spraw, aby szło boleśnie powoli 2 tygodnie po terminie płatności.
@ Thorbjørn, LOL !! ^ _ ^ Ten projekt jest tak kuszący, że jest liderem strat, który próbuje zdobyć dodatkowe interesy z tą firmą. NAJWYŻSZA JAKOŚĆ ma NAJWAŻNIEJSZE znaczenie. Jednocześnie nie chcemy się całkowicie pieprzyć, szukając garnka z miodem.
wałek klonowy
@maple, brzmi jak zły biznes plan. Następnie pozostaw gromadzenie pieniędzy księgowym i nie rozważaj dostarczania złośliwego oprogramowania.

Odpowiedzi:

9

Istnieje wiele sposobów realizacji czegoś takiego, ale oto jeden, który nie powinien być zbyt trudny:

Potrzebujesz gdzieś publicznie dostępnej witryny, na której znajduje się plik zawierający skróty kluczy licencyjnych, które zostały umieszczone na czarnej liście. Sposób zarządzania tym plikiem zależy od Ciebie, ale sam plik musi mieć tylko skrót w wierszu.

Następnie oprogramowanie regularnie inicjuje pobieranie tego pliku (większość języków po stronie serwera to umożliwia), a następnie wyszukuje hash zainstalowanego klucza licencyjnego. Jeśli zostanie znaleziony, aplikacja wie, że powinna umrzeć, dopóki czarna lista nie zostanie usunięta.

MD5 lub podobny plus sekret powinny być do tego wystarczające. Możesz stać się bardziej kreatywny i poprosić aplikację o wysłanie żądania do Twojej witryny i przeglądanie go w bazie danych w locie, ale plik (na to, co, mam nadzieję, będzie krótką listą), pozostanie mały i może być najłatwiejszy sposób.

Najtrudniejsze będzie utrzymanie martwej aplikacji. W końcu musisz to gdzieś przechowywać wewnętrznie, co oznacza, że ​​jeśli jest to zbyt oczywiste, można je łatwo obalić, a nawet jeśli nie jest to zbyt oczywiste, można je łatwo przywrócić, przywracając odpowiednie tabele / akta). Dlatego proponuję również drugą metodę ochrony.

Ta metoda przechowuje „LIVE” lub „DEAD” (lub coś wystarczająco podobnego) w tabeli lub pliku, ale ponownie HASHed. To musi być zaszyfrowane solą ORAZ datownikiem. Za każdym razem, gdy strona aplikacji jest uruchomiona, sprawdź tę wartość za pomocą zaszyfrowanej wersji „LIVE” + sól + znacznik czasu, a następnie zezwól na prawidłowy zakres znaczników czasu (na przykład jeden dzień, dwa dni, tydzień, miesiąc itp. Należy pamiętać, że im większy zasięg, tym mocniejsze uderzenie.). Tak długo, jak rzeczy się zgadzają (lub znaleziono dopasowanie), aplikacja jest aktywna; w przeciwnym razie, nawet jeśli wartość w specjalnym pliku lub tabeli to „NA ŻYWO”, nadal będzie martwa, jeśli nastąpi próba przywrócenia z kopii zapasowej, ponieważ znacznik czasu spadnie poza próg.

Podsumowując (zakłada to, że masz programową metodę sprawdzania ważności klucza licencyjnego, taką jak suma kontrolna lub inna metoda):

  • CheckBlacklist
    • Konwertuj klucz licencyjny na skrót za pomocą soli
    • Poproś o plik czarnej listy z serwera
    • Czy mój skrót jest w pliku?
    • Jeśli TAK, zapisz skrót „DEAD” + sól + znacznik czasu (skrócony do dnia; nie musisz przechowywać godzin + dni + minut)
    • Jeśli NIE, zapisz skrót „LIVE” + sól + znacznik czasu (obcięty)
  • IsKeyAlive
    • Utwórz skrót z „LIVE” + sól + odcięty znacznik czasu
    • Załaduj skrót DeadAlive
    • Czy oni się zgadzają?
    • Jeśli TAK, to żyjemy; zwróć PRAWDA.
    • Jeśli NIE, prawdopodobnie jesteśmy martwi, ale nadal możemy znajdować się w naszym oknie znacznika czasu:
      • Odejmij dzień od znacznika czasu i powtórz skrót.
      • Czy teraz się zgadzamy?
      • TAK? Zwróć wartość PRAWDA
      • Dodaj dzień do znacznika czasu i powtórz skrót
      • Czy teraz się zgadzamy?
      • TAK? Zwróć wartość PRAWDA
    • W tym momencie jesteśmy poza zakresem znaczników czasu bez dopasowania. Zwróć FAŁSZ. (Kill app)

Teraz dobroć wie, że istnieje milion i jeden sposób, w jaki może to zawieść. Rozważ wszystkie możliwe sposoby i zbuduj niezawodny system (w tym taki, który zakłada, że ​​klient ma rację, jeśli nie można pobrać pliku czarnej listy). Przetestuj, przetestuj, przetestuj, a następnie przetestuj jeszcze trochę przed wdrożeniem, ponieważ jeśli pójdzie nie tak, stracisz zaufanie klienta.

Kerri Shotts
źródło
+1 Za epicko skomplikowaną odpowiedź O_o. Mogę się mylić, ale nie sądzę, że to musi być takie skomplikowane. Nie dystrybuuję pakietu Microsoft Office, tej niestandardowej aplikacji dla jednego klienta. Wciąż pozostają te same problemy, że serwer obsługujący tę aplikację może nie być w stanie komunikować się z usługą zewnętrzną. Nie rozumiem, dlaczego szyfrowanie, skróty i sole są tutaj naprawdę potrzebne. Tak naprawdę to, czego naprawdę chcemy, to przełącznik zabicia.
wałek klonowy
Dzięki ;-) Sugeruję użycie skrótu, aby nikt, kto wącha ruch i / lub patrzy na kod / tabele / pliki u klienta, nie może powiedzieć, co się dzieje na świecie. Skróty nic nie znaczą bez udziału obu stron, a klient raczej nie zrozumie, że skrót jest w rzeczywistości reprezentacją ich klucza licencyjnego. (Gdyby były przesyłane w sposób wyraźny, od razu by się dowiedzieli.) Zmniejsza to również potrzebę szyfrowania lub SSL na twoim pliku czarnej listy - same skróty oznaczają zip.
Kerri Shotts
Uwaga dodatkowa: jeśli ufasz, że klient dostrzeże, że przywracanie niektórych tabel / plików jest zbyt trudne, możesz znacznie zmniejszyć złożoność, usuwając zaznaczenie przy każdym uruchomieniu aplikacji. To powiedziawszy, nie zajmie to zbyt długo, aby dowiedzieć się, co się dzieje i znaleźć sposób na obejście tego.
Kerri Shotts
1
CheckBlacklist: license-server.example.com: no route to hostCo teraz? Serwer licencji może nawet nie istnieć w przyszłości - i nie mów mi, że Twoja firma będzie nadal żyła za dwadzieścia lat, co jest raczej statystycznie nieprawdopodobne.
Piskvor opuścił budynek
1
Jest na to wiele sposobów, w tym nieużywanie własnych serwerów. Użyj Amazon, Google lub czegoś podobnego. Możesz też wbudować opcję „zaufanie” do testu, aby w przypadku śmierci hosta użytkownicy mogli nadal korzystać z aplikacji. Jak wspomniałem w poście, istnieje milion sposobów, w których może zawieść, i naprawdę dlatego jestem przeciwny tego rodzaju sprawdzaniu. Wolę zaufać moim klientom niż wymyślić tego rodzaju czek. (Sam klucz licencyjny, pójdę po niego. Ale umieszczenie go na czarnej liście? Nie warte wysiłku, IMO.)
Kerri Shotts,
4

Inne odpowiedzi już wykonały dobrą robotę, obejmując stronę techniczną. Ale proszę również wziąć pod uwagę stronę prawną.

Czy masz nawet prawo zablokować ich aplikację, jeśli nie zapłacą? Jeśli nie wspomniałeś o tym z góry w umowie, możesz nie mieć do tego prawa, nawet jeśli płatności wygasną (jakbyś niekoniecznie miał prawo do odzyskania czegoś, co sprzedałeś). Ponadto w wielu krajach obowiązują specjalne przepisy zabraniające „manipulacji programami komputerowymi” - to, co robisz, może być uznane za takie, a nawet narazić cię na odpowiedzialność karną.

Radzę więc najpierw porozmawiać o tym z prawnikiem, aby uniknąć wpadnięcia do gorącej wody.

W końcu lepiej byłoby polegać na systemie prawnym. Jeśli nie płacą, negocjują, a jeśli to nie pomoże, po prostu pozwać. W wielu krajach pozywanie jest stosunkowo bezbolesne i tanie, jeśli sytuacja w umowie jest jasna (w Niemczech np. Można dostać Mahnbescheida za mniej niż 20 €).

Śleske
źródło
Taki rodzaj odpowiedzi wiąże się z odpowiedzią na moje pytanie, czy jesteśmy szaleni. Odniosłem jednak wyraźne wrażenie, że nie mam wyboru i jest to coś, na co nalegają moi przełożeni, nawet jeśli nie ma tego w umowie. Niestety mieszkam i pracuję w Stanach Zjednoczonych, gdzie nie możesz założyć dużej korporacji, nawet jeśli masz rację. Mają armie prawników, którzy pogrzebią wszystko w papierkach na tyle długo, aby pozbawić nas interesu, gdyby naprawdę tego chcieli.
wałek klonowy
Zgadzam się z @sleske na korzystanie z legalnych kanałów. Upewnij się, że umowa jest solidna, a następnie pozwaj ich, jeśli naruszą warunki. A przynajmniej grozić pozywaniem. W tym, co widziałem w dużych firmach, bardzo chętnie płacą dostawcom, aby uniknąć pozwów lub naruszenia umowy.
RationalGeek
@maple_shaft: Nie mam pojęcia o sytuacji prawnej w USA, ale mam nadzieję, że sytuacja prawna nie jest tak beznadziejna, jak ją malujesz. W każdym razie, gdyby kazano ci to zaimplementować, wskazałbym potencjalne problemy. Jeśli nadal otrzymujesz zielone światło (na piśmie, oczywiście), zrobiłeś wszystko, co możesz.
sleske
Nie byłoby problemu z ograniczonym czasowo systemem licencjonowania, w którym po wygaśnięciu licencji aplikacja jest bezużyteczna. Robi to wiele firm, dużych i małych - na przykład Adobe.
James Snell
2

Jeśli hostują one wewnętrznie, czym różni się od innych programów, które możesz im dostarczyć? Zastanów się, co byś zrobił, gdybyś dostarczył, powiedzmy, aplikację do wyświetlania ekwipunku na komputery i zrób to.

David Thornley
źródło
Chyba jestem tylko zdezorientowany co do tego, co ogólnie robić. Wyobrażam sobie, że aplikacja powinna co noc sprawdzać swój klucz licencyjny, wysyłając żądanie na zewnętrzny serwer WWW z numerem licencji. Odpowiedź zakończy się sukcesem lub niepowodzeniem i będzie przechowywana w zmiennej poziomu kontekstu aplikacji. Aplikacja zasadniczo „wyłączy się”, jeśli klucz licencyjny jest nieprawidłowy. W ten sposób możemy po prostu „unieważnić” ten numer licencji w razie potrzeby.
wałek klonowy
Czy uważasz, że ta prosta strona uwierzytelniania licencji powinna być szyfrowana SSL? Nawet gdyby ktoś zaimplementował sniffer pakietów i mógł uzyskać prawidłowy numer licencji, musiałby mieć rozproszoną kopię aplikacji, aby była ona przydatna, a nawet wtedy jest bardzo celowa. Nie wyobrażam sobie, aby był użyteczny dla kogoś innego niż mój bezpośredni klient.
wałek klonowy
1

To zależy od systemu. Czy rozszerzyłeś istniejący framework, taki jak Magneto, czy napisałeś całą aplikację od zera? Jeśli tak jest później, budowanie wymagań licencyjnych nie jest zbyt trudne. Po prostu dostarczasz aplikację z licencją krótkoterminową, która wygasa 45 dni po wystawieniu rachunku, a następnie dajesz ją na stałe później.

Zakłada się, że nie przerzucasz również źródła. :)

Christopher Bibbs
źródło
Nie przekazujemy źródła. Będziemy kontrolować kod źródłowy i dystrybuować regularne wydania i poprawki błędów, gdy zajdzie taka potrzeba.
maple_shaft
1
@maple_shaft: Cóż, zawsze istnieje możliwość odmowy wydania jakichkolwiek poprawek lub aktualizacji, dopóki rachunek nie zostanie zapłacony, ponieważ podejrzewam, że konserwacja jest wbudowana w początkowy zakup lub jest sprzedawana jako bieżąca rzecz, z regularnymi datami płatności ( zwykle, ale nie zawsze, co roku).
Vatine
Kontynuując na @Vatine, w poprzednich projektach, w których brakowało silnego licencjonowania, wykorzystaliśmy defekty jako punkt dźwigni do pobrania płatności. Niektóre wady mogły nie być całkowitymi wypadkami.
Christopher Bibbs
@maple_shaft - Jeśli masz tylko jednego klienta. Rozwiązanie jest proste. Nie dostarczaj aktualizacji do tego programu, chyba że ich saldo wynosi 0 USD.
Ramhound,
1

Biorąc pod uwagę, że system jest hostowany wewnętrznie, wiele wyżej wymienionych rozwiązań obejmujących komunikację ze zdalnym serwerem może nie działać.

Zamiast tego dołącz do projektu plik licencji zawierający datę wygaśnięcia. Gdy zegar systemowy przekroczy datę wygaśnięcia, system przestaje działać. Aby zabezpieczyć plik, zaszyfruj zawartość, aby zapobiec manipulacji. Gdy użytkownik płaci lub odnawia na kolejny rok, wysyłasz mu nowy plik licencji.

Pamiętaj, że jeśli używasz PHP, kod jest łatwo dostępny do edycji przez użytkownika, więc bez względu na to, jakie zabezpieczenia wprowadzisz, użytkownik może łatwo wejść i usunąć go. Jeśli używasz ASP.NET lub innego skompilowanego języka, nie stanowi to problemu, ponieważ kodu nie można zmodyfikować.

Gavin Coates
źródło
To dobra sugestia, ale jest to spakowana i wdrożona aplikacja Java. Nadanie im nowego pliku licencji oznacza ufanie, że albo wstawią go poprawnie do pliku WAR, albo otrzymają zupełnie nowy plik WAR, co byłoby denerwujące dla wszystkich. Mają mnóstwo dokumentów i wielu informatyków, którzy muszą uzasadnić swoje istnienie w swojej organizacji, angażując się za każdym razem, gdy pojawi się nowa wersja aplikacji innej firmy. Nie lekceważę twojej sugestii tylko dlatego, że może ona być najmniej obraźliwą.
wałek klonowy
Sądzę, że nawet w przypadku większości skompilowanych języków, takich jak java, jar można łatwo skompilować, zaktualizować, ponownie skompilować, a następnie włączyć do wojny, więc jak sobie z tym poradzić?
Sudarshan
1

(Ujawnienie - Pracuję dla Agilis Software, dostawcy systemów zarządzania licencjami ).

Najskuteczniejszym rozwiązaniem jest użycie automatycznej aktywacji produktu z leasingiem licencji. Po wyjęciu z pudełka pozwala to na:

  • Automatycznie aktywuj licencje klienta. W momencie aktywacji każde wystąpienie jest automatycznie blokowane na wybrane przez ciebie parametry systemu docelowego, a limity licencji, które dla nich ustawisz, będą egzekwowane w twojej aplikacji (np. Konfigurowanie funkcji, ustawianie ogólnego okresu próbnego lub subskrypcji).
  • Ustaw „okres dzierżawy”, który jest maksymalnym okresem ważności dowolnego zdarzenia aktywacyjnego. W przypadku klientów z podejrzanym kredytem możesz to ustawić na przykład na dwa tygodnie, co oznacza, że ​​co dwa tygodnie Twoja aplikacja będzie automatycznie „dzwoniła do domu” w tle w celu przedłużenia ważności licencji. Jeśli zalegają z płatnościami, możesz wyłączyć ich licencję na serwerze hostowanym, a przestanie ona działać na następnym telefonie do domu.
  • Jeśli nie ma połączenia sieciowego z systemem docelowym, następuje proces aktywacji samoobsługi użytkownika poprzez wymianę zaszyfrowanych plików na dowolnym terminalu internetowym. Jeśli Twój użytkownik znajduje się w tej pozycji, możesz wydłużyć okres dzierżawy, aby zrównoważyć niedogodności z potrzebą zapłaty. Gdy zapłacą, możesz zrobić okres dzierżawy tak długo, jak chcesz, aż do wieczystego.
Dominik
źródło