Możesz mnie poprawić, jeśli moje założenia są tutaj błędne, ale pozwól mi wyjaśnić, dlaczego pytam.
Zaczerpnięte z MSDN SecureString:
Reprezentuje tekst, który powinien być poufny. Tekst jest szyfrowany w celu zachowania prywatności podczas używania i usuwany z pamięci komputera, gdy nie jest już potrzebny.
Rozumiem, to ma sens przechowywać hasło lub inne prywatne informacje w ciągu SecureStringponad System.String, ponieważ możesz kontrolować, w jaki sposób i kiedy są one faktycznie przechowywane w pamięci, ponieważ System.String:
jest zarówno niezmienny, jak i gdy nie jest już potrzebny, nie może być programowo zaplanowany do odśmiecania; oznacza to, że wystąpienie jest tylko do odczytu po utworzeniu i nie można przewidzieć, kiedy wystąpienie zostanie usunięte z pamięci komputera. W konsekwencji, jeśli obiekt String zawiera poufne informacje, takie jak hasło, numer karty kredytowej lub dane osobowe, istnieje ryzyko, że informacje mogą zostać ujawnione po ich użyciu, ponieważ aplikacja nie może usunąć danych z pamięci komputera.
Jednak w przypadku aplikacji GUI (na przykład klienta ssh) SecureString należy ją zbudować z System.String . Wszystkie kontrolki tekstu używają ciągu jako podstawowego typu danych .
Oznacza to, że za każdym razem, gdy użytkownik naciska klawisz, stary ciąg, który tam był, jest odrzucany, a nowy ciąg jest budowany, aby reprezentować wartość w polu tekstowym, nawet jeśli używa się maski hasła. Nie możemy kontrolować, kiedy lub czy którakolwiek z tych wartości zostanie usunięta z pamięci .
Czas zalogować się na serwerze. Zgadnij co? W celu uwierzytelnienia musisz przekazać ciąg znaków przez połączenie . Więc przekonwertujmy nasz SecureStringna System.String... i teraz mamy ciąg na stosie, bez możliwości zmuszenia go do przechodzenia do wyrzucania elementów bezużytecznych (lub zapisania zer do bufora).
Chodzi mi o to : nie ważne co robisz, gdzieś wzdłuż linii, która SecureStringma zamiar zostać przekształcony w System.String, co oznacza, że będzie istnieć przynajmniej na stercie w pewnym momencie (bez gwarancji garbage collection).
Nie mam na myśli: czy istnieją sposoby na obejście wysyłania łańcucha do połączenia ssh, czy obchodzenie przechowywania kontroli w łańcuchu (wykonaj niestandardową kontrolę). W przypadku tego pytania możesz zastąpić „połączenie ssh” „formularzem logowania”, „formularzem rejestracyjnym”, „formularzem płatności”, „formularzem karmy-którą-nakarmisz-swoim-szczeniakiem-ale-nie-twoimi dziećmi”, itp.
- Więc w którym momencie używanie
SecureStringfaktycznie staje się praktyczne? - Czy kiedykolwiek warto poświęcić dodatkowy czas na opracowanie, aby całkowicie wyeliminować użycie
System.Stringobiektu? - Czy chodzi
SecureStringpo prostu o to, aby po prostu ograniczyć czas, w którym aSystem.Stringjest na stercie (zmniejszając ryzyko przejścia do fizycznego pliku wymiany)? - Jeśli atakujący ma już środki na kontrolę stosu, najprawdopodobniej albo (A) już ma środki do odczytu naciśnięć klawiszy, albo (B) już fizycznie ma maszynę ... Więc użyłby
SecureStringprzeszkody, aby nie dostał się do dane w każdym razie? - Czy to tylko „bezpieczeństwo przez zaciemnienie”?
Przepraszam, jeśli kładę pytania zbyt gęste, ciekawość właśnie mnie ogarnęła. Odpowiedz na dowolne lub wszystkie moje pytania (lub powiedz, że moje założenia są całkowicie błędne). :)
SecureStringtak naprawdę nie jest to bezpieczny ciąg. Jest to tylko sposób na ograniczenie czasu, w którym ktoś może sprawdzić twoją pamięć i pomyślnie uzyskać poufne dane. To nie jest kuloodporne i nie było przeznaczone. Ale punkty, które zbierasz, są bardzo ważne. Powiązane: stackoverflow.com/questions/14449579/…