Zabezpieczenie ConnectionStringa

0

Witam,

są jakieś dostępne sposoby na zabezpieczanie connectionStringa do bazy? Powiedzmy mam aplikację, gdzie można przełączać pomiędzy bazami danych, dodawać, edytować połączenia. Nie wiem, czy może nie przesadziłem z tym przełączaniem, ale w swoim obecnym projekcie na stronie logowania mam przycisk Ustawienia bazy danych, po kliknięciu, którego można zmienić adres, login, nazwę bazy lub ustawić nowe hasło. Mam problem z zabezpieczeniem tego. Przynajmniej hasła.
Hasło, po zapisaniu już nigdy nie jest przekazywane do UI, tylko podczas tworzenia contextu jest wykorzystywane. Resztę w zamierzeniu można edytować, zmienić adres serwera na przykład.

I mam to obecnie rozwiązane słabo, bo jeśli chodzi o składowe connectionstringa, adres, login, hasło, nazwa bazy mam zapisane w klasie z 4 polami. Po zapisaniu nowych danych(powiedzmy pierwsze uruchomienie programu), tworzony jest klucz w rejestrze w gałęzi HKCU i zapisywany losowy ciąg znaków. Następnie przy użyciu AES każde pole klasy jest szyfrowane a następnie obiekt zapisuję do pliku, a plik w appData użytkownika. Kiedy tworzę dbcontext, connectionstring jest przez metodę "składany" z danych, znajdujących się w pliku i odszyfrowanych hasłem z rejestru.

Wiem, że pomysł jest głupi, bo ktoś, kto zdekompiluje kod i ma dostęp do rejestru to pozna hasło do bazy, ale jak zaczynałem tworzyć projekt to tylko coś takiego udało mi się na szybko wymyślić... Ktoś zna może jakieś sposoby zabezpieczenia tych danych?

2

Nie męczy Cię takie wynajdowanie koła na nowo: https://msdn.microsoft.com/en-us/library/zhhddkxy.aspx ?

1

Jak ktoś zdekompiluje kod, to będzie miał dostęp do wszystkiego.
Sprawdź sobie https://msdn.microsoft.com/pl-pl/library/system.security.cryptography.protecteddata(v=vs.110).aspx
Używałem tego ostatnio do podobnych rzeczy.

0

Nie zakładam nowego topicu, bo mam podobne pytanie odnoście connectionstringów.
Jeśli mam appkę, która łączy się z zewnętrzną bazą danych (MySQL w moim przypadku) i w CS muszę podać hasło admina...załóżmy że to hasło w SPACJA końcu zmienię, to w CS aplikacji również musi być zmienione. Da się to zrobić inaczej/szybciej niż kompilować cały program od nowa i instalować na pojedynczych PCtach?
Albo inaczej skonstruować CS tak aby za każdym nowym uruchomieniem programu odpytywał użytkownika o hasło i zapisywał to do appconfig na czas trwającej sesji użytkownika?

0

Admina to raczej na pewno nie musisz.
A cs może być w config albo gdziekolwiek. Np w protecteddata jak powyżej.
Jeśli używasz EF to cs można podać jako parametr konstruktora obiektu contextu.

0
kbi64 napisał(a):

Albo inaczej skonstruować CS tak aby za każdym nowym uruchomieniem programu odpytywał użytkownika o hasło i zapisywał to do appconfig na czas trwającej sesji użytkownika?

Wygląda na to, że tak to właśnie powinno być zrobione. Jeszcze tylko jedna kwestia. Jeśli to nie jest apka dla administratora, to raczej nie powinieneś ładować tam danych admina.

1

Nie, tak nie powinno być zrobione. Jak Ci się soft wykrzaczy to nie zdąży posprzątać configa i zostaną tam zapisane dane logowania.
Jeśli chcesz przechowywać hasło tylko w aplikacji (w pamięci) to pytaj się usera o hasło i sobie gdzieś pamiętaj z boku w jakiejś klasie czy zmiennych z ogólnym dostępem dla innych klas.

Każde utworzenie połączenia to zbudowanie CS z danymi logowania i przekazujesz taki CS do obiektu połączenia (cokolwiek to jest). Rozumiesz to czy niejasne?
Jeśli używasz DBContext do połączenia to ma on kilka konstruktorów. Pusty będzie chciał odczytać CS z config-a ale możesz użyć konstruktora z parametrem string i przekazać w nim cały CS zbudowany z danymi logowania.

0

Rozumiem, trochę bardziej teraz już to jest dla mnie jasne. Tylko pozostaje implementacja. Póki co dzięki, popracuję nad tym

1 użytkowników online, w tym zalogowanych: 0, gości: 1