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 SecureString
ponad 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 SecureString
na 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 SecureString
ma 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
SecureString
faktycznie staje się praktyczne? - Czy kiedykolwiek warto poświęcić dodatkowy czas na opracowanie, aby całkowicie wyeliminować użycie
System.String
obiektu? - Czy chodzi
SecureString
po prostu o to, aby po prostu ograniczyć czas, w którym aSystem.String
jest 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
SecureString
przeszkody, 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). :)
SecureString
tak 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/…