Stránka 1 z 1

Aktualizace SW z webu

Odeslat příspěvekNapsal: 2. 1. 2014 14:55
od KačerT
Ahoj,

mám téměř hotovou winforms aplikaci, kterou budu instalovat u zákazníků a potřebuji vyřešit dvě věci:
1. stahování nových verzí přes web
2. ověření platnosti licence

První bod je jasný, někam na web umístím nového klienta a další aktualizační soubory. V aplikaci budu mít vyřešený proces aktualizace, jak se to má zpracovat.
Pod druhým bodem si představuji, že každá licence bude mít svůj identifikátor a při spuštění aplikace se podívá na web, zda je licence platná (tímto chci ošetřit, když někdo licenci nezaplatí, tak abych mu mohl zabránit spuštění aplikace). Dále bych měl rád na webu umístěné i další údaje, jako počet zakoupených licencí, tzn. pokud by si dokoupili další licenci, tak abych na webu pouze změnil číslo a nebude potřeba další zásah. Takových údajů bych potřeboval mít na webu víc. Představuji si tedy, že by existovala nějaká tabulka, ze které bych tyto hodnoty četl. Asi budete namítat, že provoz aplikace tak bude závislý na připojení k internetu. Ano bude, anebo si ošetřím, že jim dovolím spustit aplikaci 10x bez ověření těchto údajů a poté již ne a musí si zajistit připojení k internetu.
Taky bych právě potřeboval si na ten web umístit datum, které by bylo vždy aktuální. Tímto bych si zase rád ošetřil stav, když bych poskytl časově omezenou trial verzi, tak abych nebyl závislý na datumu na stanici, kde bude aplikace nainstalovaná.

A o co mi jde?
a) Takovéhle věci jste jistě mnozí z vás řešili několikrát. Takže bych jednak potřeboval poradit, jak nejlépe zabezpečení nastavit. Jde mi totiž i o to, aby se aplikace nemohla jen tak lehce kopírovat. Napadlo mě, že bych ji "svázal" s SID stanice. Opět bych tento údaj měl v tabulce na webu. A pokud by nesouhlasilo SID s identifikátorem licence, tak by se program nespustil.
b) Potřebuji poradit, nějakého poskytovatele, kde bych si takový web udělal. Webové stránky nedělám, takže bych potřeboval něco rozumného, kde si opravdu udělám nějakou tabulku s daty, dále budu mít umístěné soubory pro stažení a ten datum.

Díky za rady.

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 2. 1. 2014 17:52
od gandor
Zvaz svoje kroky. Nonstop online nesie rizika (ddos, vypadok, nepristupnost siete) a pritom prinasa malo vyhod (ak ide len o kontrolu, tak mierna editacia host suboru a lubovolny webserver ti celu tvoju ochranu obidu + lahko sa deteguje)... Osobne by som si SID (alebo hocijaky iny HW identifikator) preniesol na lokal pocas aktivacie a nevyzadoval stale pripojenie na net. Vela tym nestratis, ale nevyzadujes alwais-online...

k b, K tomu co potrebujes ak vies robit dobre s .netom alebo niecim podobnym, tak si (iba overovaciu/bez rozhrania) stranku uz nejako zbastlis dokopy. Tej prace by potom asi fakt bolo malo a vecsina by bola aj tak len v SQL (rozhranie = web pre objednavanie, reklamacie a pod nad databazou licencii si uz mozes potom normalne objednat nech ti niekto taku stranku nakodi, resp. mozes ohnut nieco ako je wordpress - len tu stravis nejaku tu vecsiu chvilku casu a nebude to uz len na hodinku)....

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 2. 1. 2014 17:58
od karlos00x
1) tohle je jen pocit zabezpeceni. kdyz to budu chtit obejit tak proste nahodim wireshark, chytim si tu komunikaci, upravim hosts soubor a je to. da se to ztizit pouzitim SSL, kontrolou certifikatu apod, ale kdyz dokazou lidi pouzivat Adobe tak proc by nedokazali zrovna tvoji appku...
2) takovy web si urcite sam udelat nezvladnes. sver to lidem kteri tomu rozumi - kazdej lepsi webar ti to udela. a cely by to melo zacit osobni schuzkou, projit si moznosti a napady(kazda jedna podobna webova aplikace je unikatni), udelat navrh reseni, stanovit si ramcove rozpocet, jit vic do hloubky s analyzou a specifikaci a pak teprve prichazi samotna tvorba webove aplikace ktera mozna bude cca stejne narocna jako ty predchazejici etapy.

V principu si myslim, ze nekde okolo 20-30 tisic se da neco podobneho relativne kvalitne realizovat (doporucuju ti trvat na open-source reseni ktere budes schopen rozjet na jakemkoliv hostingu).

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 2. 1. 2014 19:03
od KačerT
Díky za rady.
Možná jen upřesním, že na aplikaci mám zatím pouze dvě firmy. Jedná se totiž o úzkoprofilovou evidenci a mou výhodou je know-how oboru. Nicméně bych ji po nějakém pilotním provozu rád nabízel dalším firmám v téhle branži. Zatím se mi nechce do toho nic moc investovat, než jen svůj čas. Tuhle aktualizaci, o které píši si dokáži bezproblému udělat přes FTP, jenže to mi příjde jak za krále klacka, navíc nemusí mít všude přenos povolený. Proto bych raději nějaké úložiště na webu. Stáhnout soubory z webu a nějak je zpracovat je myslím poměrně snadná záležitost.
K té aplikaci mám pak ještě konfigurační soubor, kde mám nějaké citlivé informace uloženy. Přišlo mi ale lepší mít možnost je měnit takhle přes web, než že bych jim třeba posílal nějaké aktivační klíče, z kterých bych zase nějak vyčetl, že se má navýšit počet licencí o nějaký počet apod.

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 3. 1. 2014 11:57
od gandor
KačerT: Urcite by som kvoli tomu nevyzadoval alwais online... Budes mat viac problemov ako uzitku...

Co sa tyka uloziska, tak zakladne, skarede jak svet a (pre bezneho programmera) nijako nemodifikovatelne "ulozisko" v sebe ma kazdy webserver (dokonca defaultne zapnute, len nesmies mat v nijakom adresary niektory zo startovacich suborov, ako napr. index.html, index.php, default.asp a podobne). Na dane "ulozisko" ale nemusis usera odkazovat. Citat ho moze aj skriptik (ps. nahodit na nom ochranu je o kusok tazsie (ale to asi ani nieje potrebne) a aj ta ma 2 mody - zakladna, o ktorej sa vravi, ze nieje bezpecna a pokrocila, ktora sa nahadzuje tazsie... Ale kazdy webkar si vie bezpecne ulozisko rychlo napisat, resp. nejaky OSS moze byt aj hotovy) ;)

Pokial si chces zabezpecit (aspon na oko) svoje subory, tak si pribal do projektu nejaku sifrovaciu kniznicu (ale C# NIECO urcite mat bude) a zasifruj si cely dany subor. Pri otvarani len rozsifrujes a pracujej s rozsifrovanym suborom v pamati... Neni to ani zdaleka nepriestrelne (C# podporuje debugging a disassembly, takze kazdy C#-ista sa k tomu suboru vie dostat), ale beznych uzivatelov uplne odpalis...

PS. To co pise karlos00x je sice pravda ak to chces mat spravene dobre, ale aj napriek tomu sa "zbastlit" ta stranka da (pouzi ale nejaky polotovar, existujuci redakcny system - ten wordpress ma fakt jednoduche PHP (t.z. aj zaciatocnik sa rychlejsie chyti) a na toto by mohol byt vhodny)... Zvladnes to aj sam, len nemozes ocakavat 100% kvalitu (a bezpecnost) a budes musiet zvazovat kazdu jednu feature (aj web na objednanie licencie nakoniec obsahuje viac ako iba objednavaci formular, ale ovela viac toho nedokodujes) lebo ti vsetko vezme 10 a viac krat tolko casu, ako niekomu, kto to vie...
Osobne by som si to na tvojom mieste nechal neskvor prekodovat niekym, kto to vie az po tom, co budes mat aspon nejaku viziu navratu investicie (lebo app, ktoru nikto nepouziva, tak taku pravdepodobne ani nikto nehackne a radsej zahodit "proof of concept" v hodnote 100 mojich hodin, kde si aj nieco ohmatam a mam predstavu, ako 20-30 K CZK)...

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 4. 1. 2014 00:45
od geal
Neni to ani zdaleka nepriestrelne (C# podporuje debugging a disassembly, takze kazdy C#-ista sa k tomu suboru vie dostat), ale beznych uzivatelov uplne odpalis...


Samozřejmě jen pokud si uživatel to celé nepustí ve VirtualBoxu, kde se k tomu dostane i každý céčkař a C++kař, a to i kdyby to CLR, a i třebas celý systém jinému procesu uvnitř téhož OS nedovolili.

-- 3. 1. 2014 23:46 --

KačerT píše:Tuhle aktualizaci, o které píši si dokáži bezproblému udělat přes FTP


Hlavně nezapomenout ošetřit útoky typu MITM. ;-)

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 4. 1. 2014 11:38
od KačerT
Předně díky všem za příspěvky.
Chápu, že zvažujete všechna možná rizika. Já mám však představu to udělat zatím jen nějak prostě.

Co se týče stahování aktualizačních souborů, tak tady bych nějaké riziko neviděl. Když by je chtěl někdo odchytit a "ukrást", tak je to úplně stejné, jako kdyby rovnou vzal celou instalaci aplikace. Zde mi jde opravdu pouze o to, že když udělám novou verzi, tak abych nemusel každého zákazníka obesílat s návodem upgradu nové verze, ale prostě na "jedno tlačítko" v aplikaci si novou verzi stahne z internetu.

Zabezpečení proti kopírování instalace jsem zatím vymyslel tak, že součástí aplikace je konfigurační soubor. V mém případě to je zabezpečený MS Access, tzn. s tím souborem pracovní skupiny (.mdw). Tyto soubory jsem pojmenoval "nenápadně" a změnil přípony, aby v té instalační složce nebyly tak lehce identifikovatelné. V tomto konfiguračním souboru mám právě schované citlivé informace, jako identofikátor instalace, počet zakoupených licencí, zřejmě SID stanice a další údaje. Na webu budu mít XML, které se budu snažit taky nějak "znečitelnit". Při spuštění aplikace se vždy stahne toto XML, dle identifikátoru dohledám údaje patřící konkrétní instalaci, tyto údaje se pak vždy zapíšou do toho konfiguračního souboru. No a dále pak již bude probíhat start aplikace, kdy si z konfiguračního souboru zkontroluji shodnost SID aj. a v případě, že bude vše v pořádku, tak se start aplikace dokončí.
Pokud se někomu podaří odchytit to XML a porozumí-li mu a bude schopen ty údaje změnit a zpět umístit na web, tak stejně bude mít vyhráno jen na určitou dobu. Já totiž každý den to XML na webu budu přepisovat tím mým "správným". Takže druhý den by musel celý proces zopakovat.
Co se týče rychlosti, tak stahnout xml z webu a nějak zpracovat pár údajů, je celkem zanedbatelný čas. Jak jsem psal výše, tak dovolím spustit 10x aplikaci bez toho ověření z internetu, poté již ne. Asi ještě udělám nějakou "vymoženost", že by si nechal někdo aplikaci spuštěnou nepřetržitě, tak mu ji prostě po nějaké době nečinnosti ukončím.
Takový jednoduchý web, kde budou jen viset nějaké soubory, se nabídl, že mi udělá známý a to celé mi šlo.
Jak píše karlos00x je to vše pouze o pocitu zabezpečení. Nedělám si iluze, že by to nebyl někdo schopen propálit, ale zase si nemyslím, že v tomto oboru by někdo měl takový enormní zájem do toho prolomení investovat tolik úsilí.

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 4. 1. 2014 11:56
od karlos00x
Dokud mas jen dva zakazniky tak predpokladam, ze mate mezi sebou elementarni duveru.
Tak se venuj radsi zlepsovani programu, webovky udelej prezentacni...

Dodavam zakaznikum veci zasadne pod GPL(nemam jinou moznost) a nikdy nikoho by nenapadlo s tim dal manipulovat nebo to davat zadarmo sve konkurenci. I kdyz chapu, ze delam hodne specifickou vec.

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 4. 1. 2014 18:24
od Nargon
Ohledně toho zabezpečení a licencí. Imho jde o to zda to chceš jen pro "sledování" zda to uživatelé používají tak jak mají zakoupené licence, nebo zda opravdu chceš "zabránit používání" když to budou používat v rozporu s licencí.

Pokud by ti stačilo sledování jak to uživatelé používají, tak stačí když při každém spuštění odešleš na svůj server nějaké SID stanice + Licenční kód. A pak se na tom serveru budeš dívat kolik SID bylo odesláno ke které licenci, a když to překročí zadaný počet tak to chce inteligentně prohlédnout záznamy a zkontrolovat zda opravdu došlo k překročení počtu licencí nebo třeba jen uživateli odešel PC a spustil to na jiném s jiným SID, kde by bylo přesně vidět že jedno SID v nějaký okamžik přestal komunikovat a ve stejný začalo komunikovat jiné SID. atd.
A když zjistíš že to bude opravdu porušení licence, tak jim třeba odeslat email aby si zakoupili další licence. Tohle je myslím celkem fér a dostatečné pro tvůj případ. Pokud odmítnou zakoupit další licence, tak je vždy můžeš udat policii že používají tvůj software v rozporu s licencí a způsobují ti škodu XXX peněz.

Pokud by se jednalo i o ten druhý případ, aby to uživatelům zabránilo v používání aplikace, když ta licence nebude platná. Tak i na to bych měl vymyšlený způsob a myslím že celkem bezpečný a pro jeho obejití je nutné hacknout a upravit kód aplikace. Jen je to celkem složité a nechce se mi sem psát tak dlouhý post pokud to opravdu nepotřebuješ.

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 7. 1. 2014 19:18
od KačerT
to Nargon: pravda je, že pokud budu mít napevno uložené SID a oni jen provedou legální přeinstalaci na jiný comp, tak jim to přestane fungovat a budou se divit a bude to vyžadovat můj zásah. Asi by taková situace nebyla častá, ale stát se může a popravdě bych byl raději, aby nebyl s tímhle uživatel "obtěžován".
To co popisuješ není úplně marné, jen to zase bude vyžadovat nějakou mou činnost v podobě kontroly. Kua jak se programátor lehce stane línou bytostí, když ví, nebo má aspoň povědomí, že se to dá zautomatizovat :-] Ano, mohl bych si na to udělat nějaký scriptík, který by tu kontrolu provedl za mě.

Nicméně k tomu druhému případu, určitě by mě zajímalo řešení. Takže pokud by ses s tím chtěl podělit, tak budu jen rád. Díky, díky.

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 7. 1. 2014 23:05
od Just_jo
Co takhle zvolit licenční server a plovoucí licence? Firmám by to ulehčilo administraci.
Ne všechny firmy mají povolené připojení k internetu na všech stanicích ( pouze intranet ).
Navíc by si takto mohly určit na jakých stanicích bude aplikace spuštěna

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 8. 1. 2014 17:50
od Nargon
Ok tak ten druhý způsob je kombinace asymetrické šifry a cyklické generování klíčů na jedno použití.

A) Tak první část je generování klíčů na jedno použití pomocí nějakého algoritmu.
Důležité je aby ten algoritmus fungoval podobně jako hash, tj ze stejného vstupu vždy obdržíš stejný výstup. Asi by se dal použít i hloupý čítač, který bude postupně vracet hodnoty 1, 2, 3, ... Ale pro větší robustnost a obtížnější prolomení bych použil nějaký HMAC algoritmus, což je téměř normální hash, jen se tam přidává i klíč. Tj třeba HMACSHA1.
A tohle budeš používat tak že nový klíč na jedno použití (budu tomu říkat hash) vygeneruješ tak, že vezmeš současný hash, vložíš ho do HMACSHA1 (plus nějaký ten hašovací klíč co do toho algoritmu vložíš) a dostaneš nový hash pro příští použití.

B) Druhá část ohledně asymetrické šifry bude použita na komunikaci s licenčním serverem.
Privátní klíč budeš mít zabezpečený na tom licenčním serveru. Veřejný klíč budeš mít natvrdo zadaný v kódu aplikace. A veškerá komunikace mezi aplikací a licenčním serverem bude probíhat tak že data ze serveru do PC budou na serveru zašifrované soukromým klíčem a na PC s programem dešifrované veřejným klíčem. A při opačné komunikaci na PC zašifruješ data veřejným klíčem a na serveru dešifruješ soukromým klíčem.
Jako asymetrickou šifru můžeš použít cokoli. Asi úplně bude stačit RSA s nějakým 8192bitovým klíčem. Ale jestli chceš můžeš použít třeba i certifikáty.

Toto jsou základní stavební kameny.

Teď komunikační cyklus jak bude fungovat.

1) Při instalaci nebo prvním spuštění aplikace se provede Inicializace.
Tj se načte licenční klíč + SID stanice, a toto se odešle na licenční server (při komunikaci budou data zašifrována tím veřejným klíčem, takže jediný kdo to přečte je server, který má příslušný dekódovací - soukromý klíč). Na licenčním serveru ověříš zda mají nárok na provedení inicializace licence. Tj třeba přidělený licenční klíč mají právo nainstalovat na 5PC a máš v databázi záznam jen o 4 SID. V jiném případě to asi bude vyžadovat ruční zásah a zjistit proč potřebují další inicializaci licence. Jestli třeba přišli o disk nebo co a proč, a z databáze vymazat informaci o SID které tedy zaniklo a místo něhož chtějí novou inicializaci licence. Tento stav bych moc neuatomatizoval protože nikdy nevíš o co jde, ale mělo by k tomu docházet jen vyjímečně.
Po úspěšném ověření licence na serveru dojde k vygenerování prvního HASHe, tj server vygeneruje nějaký náhodný hashovací klíč, který použije v HMAC algoritmu, a provede výpočet hashe z licenčního kódu. a tento hash si uloží (Pro příklad to bude třeba ABCD). Server klientovy pošle ten náhodný hashovací klíč co vytvořil (samozřejmě zašifrované privátním klíčem asymetrické šifry). A klient provede to samé. Použije tento přijatý klíč, zadá ho do HMAC a vytvoří HASH z licenčního čísla a ten HASH si uloží jako současný použitý.

2) Klient zašle na server počet jednorázových klíčů, které má uložené (po provedení bodu 1 nemá žádný). Server vygeneruje nové klíče až do počtu třeba 3 pomocí postupu A)
Tj pro představu má uložen hash ABCD a klient poslal číslo 0 a do počtu 3 je potřeba vygenerovat 3 klíče.
použije klíč 123 a zhashuje hodnotu ABCD, dostane nový hash EFGH.
použije klíč 456 a zhashuje hodnotu EFGH, dostane nový hash IJKL.
použije klíč 789 a zhashuje hodnotu IJKL, dostane nový hash MNOP.
a po provedení bude mít server uložen hash MNOP. Na klienta zašle použité klíče a odpovídající výsledný hash. Tj odešle na klienta toto: 123-EFGH; 456-IJKL; 789-MNOP;
Klient si toto uloží do vlastního seznamu jednorázových klíčů v pořadí v jakém to server generoval a poslal.

3) Kontrola klíče. Klient si načte aktuální svůj HASH (Tj ABCD), do HMAC algoritmu vloží klíč co dostal od serveru (123) a zhashuje aktuální hodnotu ABCD, a dostane EFGH. Toto si uloží jako aktuální hash to co vypočítal (EFGH), současně ho porovná s tím co dostal od serveru ke klíči 123, a tento jednorázový (123-EFGH) hash ze seznamu smaže. Pokud se jednorázové hashe shodují tak OK, pokud se neshodují tak špatná licence a zabránit ve spuštění.

Při inicializaci by měli proběhnout body 1 a 2;
Při každém spuštění by měli proběhnout body 3 a 2 (v tomto pořadí) a tedy měli by být drženy celkem 3 jednorázové klíče u klienta. Ukládání aktuálního hashe a seznamu jednorázových hashů by mělo probíhat do stejného "souboru / databáze" jako ostatní konfigurace/uživatelská data.

Uff, to je myslím celé.
Je to odolné proti podvrhnutí jiného licenčního serveru, protože privátní klíč pro tu komunikaci má jen tvůj server a nikdo jiný. Útočník by musel prolomit použitý asymetrický kód a zjistit privátní klíč, což je velmi náročné. Nebo by musel upravit kód aplikace a zadat si tam vlastní veřejný klíč.
Protože jsou lokálně držené 3 jednorázové klíče, tak bez přístupu k internetu lze aplikaci 3x spustit, kolik jednorázových hashů dopředu budeš generovat je na tobě, 3 jsem použil pro příklad.
Pokud by se někdo pokusil nainstalovanou aplikaci zkopírovat a spustit obě kopie, tak po použití těch tří držených klíčů dojde k tomu že klíče co generuje server nebudou shodné s tím co se vypočítá u klienta a přestanou fungovat obě kopie. Pokud aplikaci přesune, tj nebude používat původní kopii, tak ta nová bude fungovat bez zásahu tak jak má.
Důvod proč by se HASHe měli ukládat do stejného souboru jako ostatní uživatelská data je z důvodu kdy by někdo chtěl po ukončení aplikace vrátit zálohovaný soubor s těmi hashy, aby mohl zase 3x spustit aplikaci. Ale když to budeš ukládat do stejného souboru tak to bude velice nepříjemné protože si v aplikaci nebude moci ukládat data.

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 8. 1. 2014 19:02
od gandor
Osobny nazor:
Nepustal by som sa do toho. Kopec implementacie, kopec roboty, vyzadujem vecne prihlasenie, vyzadujem sifrovanu komunikaciu (=overhead na vykon a datovy tok) a pritom ktokolvek moze distribuovat "prelomenu" verziu s vlastnym licencnym serverom s napr. 10 000 moznymi spusteniami (staci mat 1 zakupenu licenciu a investovat cca 1/3 usilia potrebnemu k implemetacii toho riesenia)...

Ale inak ano, bude to fungovat...

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 8. 1. 2014 21:36
od geal
KačerT píše:Co se týče stahování aktualizačních souborů, tak tady bych nějaké riziko neviděl. Když by je chtěl někdo odchytit a "ukrást", tak je to úplně stejné, jako kdyby rovnou vzal celou instalaci aplikace.


Já měl na mysli ochranu uživatele před útokem třetí strany, ne ochranu dodavatele programu. (Je pravda, že při několika uživatelích to možná nemá až takový smysl. Ale zase používat HTTPS místo FTP snad není tolik práce?)

Re: Aktualizace SW z webu

Odeslat příspěvekNapsal: 12. 1. 2014 10:49
od KačerT
to Nargon: Moc díky za tak rozsáhlý příspěvek a především čas, který jsi tomu věnoval.
Zajímalo mě právě Tvé řešení zabezpečení a tohle je opravdu robustní. Já zatím nemám licenční server a uvidím později, zda ho nakonec budu muset využít. Nicméně hashe budu určitě používat při předávání informací.
Zatím zkusím nějaké prosté zabezpečení a ve chvíli, kdyby to okolnosti vyžadovaly, tak se pustím třeba právě do tohoto. Jsem rád, žes to sem postnul. Díky.

to geal: zatím mám řešené přes http, zkusím známého, zda by uměl připravit https ;-]