[C#] Bezpečné uchování přihlašovacích údajů

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Tepster 29. 4. 2015 08:45

Zdravím,

Chci, aby se aplikace připojila na FTP a něco tam dělala. Pokud ale přihlašovací údaje normálně napíšu do kódu jako string, zkompiluju a pak program otevřu v notepadu, po chvíli hledání ty údaje najdu. To je samozřejmě špatně. Jak se řeší tento problém? Kam mám údaje napsat, aby byly skryté?

Díky
Tepster
Junior

Odeslat příspěvekod JirkaVejrazka 29. 4. 2015 08:56

Pred kym je chces chranit? Ptam se proto, ze to nema jednoduche reseni. Proti beznemu uzivateli staci ulozit udaje zasifrovane a pred pouzitim rozsifrovat.
Proti pokrocilemu uzivateli to nestaci - protoze FTP potrebuje udaje v "citelne podobe", musi byt tvuj program schopen je z nejakeho formatu dostat zpet do citelne podoby - pokrocily uzivatel je schopen zjistit jak a dostat se tim k heslu.
Proti elitnimu hackerovi to chranit nemusis - ten si pocka, az probehne ten FTP prenos a heslo si odchytne na siti - FTP je nezabezpeceny protokol, ktery mel uz davno vymrit.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod johnnash 29. 4. 2015 09:12

[ot]Elitni hacker :D myslis pres wireshark? [/ot]
Teoreticky bys mohl posilat heslo posilat v zasifrovane podobe na nejakej proxy server kterej by to desifroval a az pak nasledne komunikoval s ftpkem.
johnnash
Junior

Odeslat příspěvekod Bugscz 29. 4. 2015 09:35

Tak si udělej šifrovací a dešifrovací funkci. Šifrovací v programu co nebudeš nikam sdílet a v hlavním programu jen tu dešifrovací. Pomocí šifrovací si vytvoř ten string, který následně vložíš do FTP přes funkci dešifruj. Já vím, je to drbání pravou rukou za levým uchem, ale základní zabezpečení to je. :-)
Bugscz
Junior

Odeslat příspěvekod Nargon 29. 4. 2015 12:33

Nad podobným problémem jsem nějakou dobu přemýšlel a nic jsem nenašel. Vždy když jsem dostal nápad na ochranu tak mě ihned napadlo "jak to obejít".
Problém je v tom, že jakmile máš v aplikaci napsanou "funkci" která ti to heslo odněkud stáhne nebo třeba dešifruje nebo i vygeneruje ze sériového čísla desky atd, tak případnému útočníkovi stačí tuto funkci analyzovat a následně vykonat stejnou činnost a dostane heslo.
Nebo jak je tu napsáno poslat zašifrovaně na proxy server, a až ten proxy server bude komunikovat s FTPkem, to může částečně fungovat, ale případnému útočníkovy nic nebrání poslat to "zašifrované" heslo na ten proxy server a komunikovat s tím ftpkem přes ten tvůj "proxy server". Tj útočník se zachová jako ta tvoje "regulérní" aplikace.

Opravdu, jestli to chceš zabezpečit proti BFU Hackerovi (tj aby to heslo nebylo vidět přímo v kódu), tak ho musíš nějak zašifrovat/zakódovat/schovat. A na to stačí třeba blbé kódování BASE64. Tj ty do kódu aplikace zadáš heslo: "TcOhbmnEjWthTcOhUsOhZGFQZXDDrcSNa2E0JA==" a před použitím ho přes BASE64 dekóduješ do původní formy: "MáničkaMáRádaPepíčka4$" a to použiješ jako heslo. A to by mělo stačit. Protože nikde v kódu nebude uvedené to správné heslo tj MáničkaMáRádaPepíčka4$, ale najdeš tam jen text TcOhbmnEjWthTcOhUsOhZGFQZXDDrcSNa2E0JA== který jako heslo nefunguje :) Cokoli složitějšího nemá cenu, schopnější hacker dokáže zjistit "jak z toho textu vyrábíš heslo" a provede tu stejnou činnost a získá heslo. Je zbytečné investovat čas a peníze na složitější ochranu.

Možná jako dobrá ochrana může být to že vytvoříš speciální účet na FTP, který třeba bude mít jen právo čtení na jeden konkrétní soubor. A tyto FTP údaje zadat do aplikace. Pak ikdyž je útočník použije tak si bude moci jen přečíst ten jeden soubor a nic víc na tom FTPku neudělá. Ovšem to záleží na povaze tvé aplikace co s tím FTPkem vlastně dělá :) zda jí bude stačit, že si může přečíst obsah toho jednoho souboru.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod JirkaVejrazka 29. 4. 2015 13:01

Vždy když jsem dostal nápad na ochranu tak mě ihned napadlo "jak to obejít".


Protoze ono to opravdu nejde vyresit...
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod JanFiala 29. 4. 2015 13:50

A já jen přidám k zašiforvanému heslo ve zdrojáku info, že existuje i šifrovaná komunikace s FTP (FTPS), kde se údaje nepřenáší jako prostý text, takže ti pak ani ten WireShart nepomůže.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 29. 4. 2015 14:21

Zasifrovane heslo toho resi malo (viz muj puvodni prispevek). Jediny bezpecny zpusob je ziskavat heslo vzdy z externiho zdroje (od uzivatele, ze smart karty apod.)

FTPS existuje (stejne jako SFTP), ale na to se uzivatel neptal :)
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod PiranhaGreg 29. 4. 2015 14:40

Přístupové údaje musíš skladovat někde mimo aplikaci, kde ti je bude chránit OS a povolí ti k nim přístup až při přihlášení do systému. Windows k tomu samozřejmě nějaké API má.

Když se aplikace dostane do nepovolaných rukou, nic se neděje. Pokud ale hacker například zná přístupové údaje do systému a má na chvíli k dispozici klientský počítač, přístupové údaje samozřejmě získá. To už je pak na tobě, co všechno mu na serveru povolíš dělat...

V případě FTP pak samozřejmě ještě celá bezpečnost padá s nezašifrovaným přenosem údajů po síti. Dnes ale skoro každý hosting podporuje FTPS a některé dokonce SFTP, tak využívej je.
PiranhaGreg
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod JanFiala 29. 4. 2015 18:37

JirkaVejrazka píše:Zasifrovane heslo toho resi malo (viz muj puvodni prispevek). Jediny bezpecny zpusob je ziskavat heslo vzdy z externiho zdroje (od uzivatele, ze smart karty apod.)


Osobne bych to az tak nehrotil. Pokud heslo zasifruju dostatecne silnou sifrou, pak je klidne i v INI souboru dostatecne chranene. Samozrejme muzes namitnout, ze hacker muze krokovat program a dostat se tak k zasifrovanym udajum.

Ale podle mne uzivatel chce nejakou automatickou cinnost, ne aby uzivatel zadaval rucne jmeno a heslo. To ja pak nemusi vubec ukladat do aplikace. A jestli chces ziskavat heslo ze smartkarty, jsi na tom uplne stejne jako kdyz je v INI souboru. Uzivatel tu smartkartu necha bud trvale zastrcenou ve ctecce nebo bude polozena vedle klavesnice... A pak to ma hacker jeste jednodussi.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod PiranhaGreg 29. 4. 2015 18:46

Zašifrovaný heslo vůbec nic neřeší, pokud ho umí aplikace bez cizí pomoci dešifrovat. Existují aplikace jako .NET Reflector, se kterými lze inkriminovanou část kódu velmi rychle najít. Trošku bezpečnější jsou pak na tohle jazyky, kde se program překládá přímo do strojového kódu. Když se pak ten dešifrovací postup šikovně zastrčí do zdrojáku a při překladu jsou ještě zapnutý optimalizace kódu, už to není vůbec sranda. Ale pořád si s tím zkušený hacker poradí relativně rychle.
PiranhaGreg
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod JanFiala 29. 4. 2015 20:43

Pak už zbývá jen zvážit, zda vynaložená námaha na skrytí stojí za výsledek a zda vůbec nějakému hackerovi bude stát zjišťování hesla za tu námahu.

Dá se to řešit i tak, že se heslo bude vytvářet dynamicky (např. podle datumu a času + nějaké nesmysly okolo) a stejně tak se bude měnit heslo i na serveru. Pak už stačí napsat nějaký nástroj na změnu hesla na serveru - k tomu by měl postačit nějaký CRON skript.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod PiranhaGreg 29. 4. 2015 20:56

To nijak neřeší, že tento mechanismus může odkoukat i případný záškodník a použít ho také.
PiranhaGreg
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 29. 4. 2015 21:07

Vzhledem k tomu, ze to heslo ma byt pro FTP, je nejake extra zabezpecovani fakt docela skoda energie...
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Maxos 29. 4. 2015 21:28

Po pravde asi sa to ani neda ale mozes mu to stazit. Proti reflectoru sa da branit napr nejakym obfuscatorom. Z kodu ti spravi necitatelnu hatlaninu ktora ale ide ku podivu spustit. Ak by si to chcel riesit co najbezpecnejsie vytvoril by som si zabezpecenu WCF sluzbu ktora by mi posielala prihlasovacie udaje do aplikacie na zaklade jedinecneho identifikatora pre dane PC. Tu by si mal pod kontrolou aj zmenu hesla v pripade nejakeho problemu bez toho aby si preinstaloval aplikaciu u klienta.
I like Opera...
Maxos
Junior

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků