Diskuze: Zašifrování přihlašovacích údajů pro desktop aplikaci

C# .NET .NET (C# a Visual Basic) Zašifrování přihlašovacích údajů pro desktop aplikaci American English version English version

Aktivity (3)
Avatar
Erik Šťastný:15. června 15:23

Zdravíčko,

mám WPF aplikaci a potřebuji nějak uložit na disk přihlašovací údaje k například ftp službě abych ji mohl z WPF aplikace používat.

Zkusil jsem: Napadlo mě do aplikace zabudovat nějaký šifrovací klíč společně se šifrovacím algoritmem, následně přihlašovací údaje vyplníte v aplikaci ta je zašifruje a uloží na disk. Když je potřebuje, tak je z disku přečte a zase si je odšifruje zpět.

Chci docílit: Dává řešení smysl? Používá se v praxi nějaké jiné? Případně jaký šifrovací algorytmus k doporučení? děkuji :)

 
Odpovědět 15. června 15:23
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Erik Šťastný
Petr Čech:15. června 23:41

Ahoj, nijak moc bezpečně to udělat nejde, ale jde docela dobře házet klacky pod nohy.
Několik věcí bude společné pro všechny přístupy:

  1. Použiješ symetrický algoritmus. Prakticky standardem je AES, neexistuje na něj žádný efektivní útok a používá se prakticky všude.
  2. V žádném případě se nebudeš pokoušet vymyslet vlastní šifrování (pokud to myslíš alespoň trochu vážně)

Symetrický algoritmus je takový, co používá stejný klíč pro šifrování a dešifrování. To znamená, že nějakým způsobem musíš získat klíč (o tom později). Potom vezmeš tvé heslo, zašifruješ a uložíš na disk - zpátky obráceně.
Až do teď to není příliš zrádné, problémy začnou v momentě, kdy chceš získat klíč.
Máš minimálně 3 možnosti (od nejhorší po použitelnou):

1. fixní klíč v kódu
Prostě do kódu na tvrdo zadáš klíč, kterým se bude šifrovat. Heslo pořád bude zašifrované, ale v momentě, kdy ten klíč v tvém kódu někdo objeví (nemusí mít kód!, stačí zkompilované .exe, jen je to těžší), automaticky je prolomena ochrana úplně všech hesel na všech počítačích, co ten program používají.
Tato technika je zcela nepoužitelná (ačkoliv lákavě jednoduchá)

2. dynamicky generovaný klíč
V podstatě stejné řešení jako v bodu 1, ale klíč není v kódu aplikace a tudíž je pro každý počítač rozdílný. Problém je, že ten klíč musí být v čitelné podobně pořád někde uložen na počítači a proto by si ho mohl přečíst i útočník. Klíč se dá ale schovat na různá neočekávaná místa, do registrů a pod.
Ten klíč se dá třeba vygenerovat při prvním spuštění programu, nebo se může měnit při každém spuštění a hesla se přešifrovat.
Tohle je relativně bezpečné, ale jakmile někdo přijde na to, kam se klíč ukládá a jak, zase je to zcela neefektivní.

3. ochrana uživatelským heslem
Heslo není nikde uloženo na počítači, ale odvodí se z hesla napsaného uživatelem. Samotné heslo ale nelze použít k šifrování, musí se z něj bezpečně vytvořit klíč - C# na to má přímo dedikovanou třídu: https://msdn.microsoft.com/….110%29.aspx?…
Nevýhoda je, že to je jen tak silné, jak silné heslo si zadá uživatel. Výhoda je, klíč není na počítači nikde uložen, takže si ho útočník nemůže jen tak někde přečíst.


Pokud chceš dobré zabezpečení za cenu uživatelského nepohodlí (vždy je třeba zadat heslo), použij 3. možnost, pokud je zadávání hesla příliš nepohodlné a na tom FTP serveru není nic mission-critical, můžeš přemýšlet i o 2. možnosti, je "good enough".

Také bych si přihřál svou polívčičku a doporučil ti mou knihovnu na AES šifrování v C#: https://www.nuget.org/…/csharp-aes/ , co umí pobrat jak klíč, tak uživatelské heslo.

Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět  +3 15. června 23:41
the cake is a lie
Avatar
Odpovídá na Petr Čech
Erik Šťastný:18. června 9:17

Díky za tipy, zvolím asi druhou možnost, mělo by jít o once setup věc a uživatel by o ní ani neměl vědět.

 
Nahoru Odpovědět 18. června 9:17
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.