Cześć,
Piszę prostą aplikację bazodanową i staram się ją zabezpieczyć na tyle, żeby nie dało się pozyskać hasła do bazy danych z pamięci. Connection Stringa nie przechowuję w żadnych plikach, ale każdą poszczególną informację osobno w rejestrach Windows. Hasło oczywiście zaszyfrowane. Nie chcę wchodzić w dyskusję na temat tego, że i tak nie jest to w 100% bezpieczne rozwiązanie, bo tak naprawdę żadne przechowywanie haseł nie jest.
Moim problemem jest to, że dzięki programowi ProcessHacker (taka nakładka na Task Managera) mogę dostać się do pamięci każdego wątku (w tym mojej aplikacji) i podejrzeć m.in. connection stringa. Innymi programami, specjalnie do tego przeznaczonymi byłoby to pewnie jeszcze prostsze.
Każde połączenie do bazy jest inicjowane ad hoc. Nie trzymam połączenia przez całe działanie programu. Metoda GetConnectionString() pobiera dane z rejestrów (w tym hasło) i je dekoduje oraz zwraca ciąg znaków (return $"SERVER={server}; UID={uid}; DATABASE={database}; PASSWORD={password}; PORT={port}"; ) za każdym razem.
Połączenia do bazy są otwierane z przy użyciu using () , a mimo to w pamięci wciąż widać pełny connection string ze zdekodowanym hasłem, jak widać w załączniku.
Korzystam z MySql i komponentów MySql.Data (v.8.0.20.0) z NuGeta
using (MySqlConnection connection = new MySqlConnection(DataAccess.GetConnectionString()))
{
connection.Open();
string query = " SELECT REKORD FROM TABELA " ;
using (MySqlCommand command = new MySqlCommand(query, connection))
{
(pobieranie rekordów itd)
}
}
Podpowiedzcie mi, dobrzy ludzie, jak ukryć tę informację...Przynajmniej na czas, gdy połączenie nie jest otwarte.