Cześć, mam taki problem. Aplikacja zapisuje w rejestrze systemowym (lub w jakimś pliku) dane wrażliwe - dane służące do połączenia z bazą danych.
Takie dane muszą być w jakiś sposób zaszyfrowane. Jednak szyfrowanie jakie znam wymaga hasła - do zakodowania i zdekodowania danych.
I teraz sprawa wygląda tak:
- Użytkownik wypełnia dane połączeniowe
- Klika OK
Program musi teraz te dane zaszyfrować. Oczywiście nie będzie się pytał użytkownika o hasło szyfrujące, bo to bez sensu. Musiałby przy każdym uruchomieniu pytać się o takie hasło. W związku z tym hasło musi być gdzieś zapisane w aplikacji na stałe. I teraz pytanie - jak to zrobić najlepiej? No bo hasło w formie stringa odpada. Tym bardziej jako stała.
Poczytałem trochę i wpadłem na klasę SecureString. Dodaje się do niej znaki po kolei i są jakoś szyfrowane w pamięci, a potem od razu usuwane. Wpadłem więc na taki pomysł:
LinkedList<char> list = new LinkedList<char>();
list.AddLast('H');
list.AddLast('a');
list.AddLast('s');
list.AddLast('ł');
list.AddLast('o');
SecureString str = new SecureString();
foreach(char ch in list)
str.AppendChar(ch);
Czyli rozsiać hasło po stercie i złożyć je w SecureStringu.
Tak naprawdę nie wiem, jak to zadanie powinno być wykonane poprawnie. Oczywiście, gdybym pisał program dla Pentagonu, to użytkownik po prostu musiałby za każdym razem wpisywać hasło ;) Natomiast to jest zwykły program dla zwykłych ludzi. Jednak chcę mu zapewnić jakieś bezpieczeństwo. Czy mój pomysł jest dobry? Czy takie rzeczy robi się inaczej?
A może kombinuje i wystarczy hasło w zwykłym stringu i do tego jakikolwiek obfuscator?