Jest więc ta klasa, która wydaje się bardzo rzadko używana: SecureString. Istnieje już od co najmniej 2.0 i jest kilka pytań SO, ale myślałem, że zadam własne pytania:Bezpieczne używanie SecureString dla formularza logowania
Mam LoginForm; proste okno dialogowe WinForm z nazwą użytkownika i (maskowane) pola hasła. Kiedy użytkownik wchodzi i kliknie "Zaloguj się", informacja jest przekazywana do wstrzykniętej klasy uwierzytelniania, która wykonuje warstwę rozciągania klucza, a następnie haszuje połowę klucza rozciągniętego w celu weryfikacji, podczas gdy druga połowa jest kluczem symetrycznym dla zaszyfrowanego użytkownika dane konta. Kiedy to wszystko się skończy, loginForm zostanie zamknięty, a klasa uwierzytelniająca zlikwidowana, a system przejdzie do ładowania głównego formularza. Całkiem standardowe, może nieco bardziej skomplikowane niż standardowe hash-the-password-and-compare, ale proste hashowane hasło zostanie w moim przypadku pokonane, przechowując dane użytkownika w postaci zwykłego tekstu, ponieważ dane te zawierają dane uwierzytelniające dla trzeciego użytkownika. system imprezowy (i wszyscy wiemy, jak ludzie lubią ponownie używać haseł).
Oto pierwsze pytanie; w jaki sposób używać SecureString do pobrania hasła z pola tekstowego Hasło, bez jest narażone jako zwykłe System.String poprzez właściwość Text pola tekstowego? Zakładam, że istnieje sposób na uzyskanie dostępu do niezarządzanego okna GDI dla pola tekstowego, który jest zawijany przez klasy CLR, i przeciągnij dane tekstowe za pomocą klasy Marshal. Po prostu nie wiem jak i nie mogę znaleźć dobrych informacji.
Oto drugie pytanie; kiedy mam hasło jako SecureString, w jaki sposób mogę przekazać go do dostawcy wartości mieszającej z przestrzeni nazw System.Security.Crypto? Domyślam się, że użyłbym Marshal.SecureStringToBSTR(), a następnie Marshal.Copy() z zwróconego IntPtr z powrotem do tablicy bajtów. Mogę następnie wywołać funkcję Marshal.ZeroBSTR() w celu wyczyszczenia pamięci niezarządzanej i mogę wyzerować zarządzaną tablicę za pomocą metody Array.Clear(), gdy tylko uzyskaję skrót. Jeśli istnieje czystszy sposób, który pozwala mi na pełną kontrolę nad czasem życia każdej zarządzanej kopii pamięci, mów.
Pytanie trzecie; Czy to wszystko jest naprawdę konieczne, czy też nieodłączna niepewność System.String w środowisku pamięci zarządzanej jest trochę przesadzona? Wszystko, co jest używane do przechowywania hasła, szyfrowane lub nie, powinno być poza zakresem i być w drodze do garbage collectora na długo zanim system operacyjny rozważy zamianę aplikacji na pamięć wirtualną (pozwalając na wykradanie hasła z pliku wymiany po ciężkim zamknięciu komputera). Atak typu "zimny but" to teoretyczna możliwość, ale tak naprawdę, jak powszechne jest to? Największym problemem są obecnie odszyfrowane dane użytkownika, które zawieszają się jako część użytkownika przez cały okres użytkowania aplikacji (i dlatego będą głównym kandydatem do używania SecureStrings, ponieważ poza kilkoma podstawowymi zastosowaniami pozostają dość uśpione).
Chodzi o zmniejszenie powierzchni ataku. Na przykład, jeśli atakujący nie może odczytać pamięci, ale może uzyskać dostęp do pliku wymiany, SecureString może pomóc. Nigdy nie możemy przewidzieć, co atakujący może lub nie może zrobić, więc staramy się uczynić rzeczy najtrudniejszymi dla nich. Ale tak, żadna ilość ochrony nie pomaga: jeśli aplikacja zna informacje - atakujący może również. –
Domyślam się, że najlepszym argumentem przeciwko 'SecureString' jest to, że programista najlepiej spędzić gdzie indziej. – usr
Nie muszę wierzyć, że osoba atakująca może zobaczyć wpisywane znaki, aby uwierzyć, że atakujący może pobrać plik wymiany. Poziom zaawansowania i wymagany dostęp są bardzo różne. Tak więc, mogę przewidzieć przewagę SecureString w niezbyt znanym scenariuszu wymagającym długoterminowych danych wrażliwych przechowywanych w pamięci (takich jak wspomniane wyżej dane uwierzytelniające firm trzecich, które działają tak długo, jak aplikacja działa i mogą z powodzeniem zostać wykorzystane). plik wymiany). Ale myślę, że zgadzam się z twoim punktem widzenia, że 9 razy na 10 to więcej problemów, niż jest to warte. – KeithS