2011-06-26 7 views
10

Piszę mały program dla siebie za pomocą C#, które mogę użyć do przechowywania moich haseł, a następnie pobrać je do przeglądania/edycji.SecureString do przechowywania w pamięci i prezentowania haseł? Albo coś innego?

Podczas gdy hasła są przechowywane na dysku w formacie zaszyfrowanym, gdy są odczytywane do pamięci w celu wyświetlenia/edycji w formularzu, są one niezaszyfrowane.

Dowiedziałem się, że posiadanie niezaszyfrowanych haseł w pamięci jest dość dużym problemem z zabezpieczeniami, więc natknąłem się na klasę SecureString.

Czy byłby to bezpieczniejszy sposób niż przy użyciu klasy SecureString, czy też SecureString spełnia swoją nazwę?

+6

* Nigdy * nie przechowuj haseł, nawet nie zaszyfrowanych. Przechowuj tylko skrót. –

+4

@HansPassant dobra rada, ale to brzmi jak menedżer haseł. Oczywiście menedżer haseł nie może uciec z przechowywaniem tylko skrótów. –

Odpowiedz

10

SecureString utrzymuje tekst zaszyfrowany w pamięci i można go wyrzucić natychmiast, gdy nie jest potrzebny. Problem polega na tym, że gdy chcesz go wyświetlić lub użyć w niemal każdy inny sposób, musisz przekonwertować go na zwykły ciąg, który nie jest bezpieczny.

Ponadto, nie będę na nim zbytnio polegać - system jest w stanie odszyfrować go bez żadnego klucza odszyfrowywania, co oznacza, że ​​zdeterminowany haker najprawdopodobniej będzie mógł zrobić to samo. Kiedy haker zyskuje kontrolę nad twoim komputerem, nie możesz być pewny czegokolwiek i prawdopodobnie będzie mógł uzyskać dostęp do wszystkiego, co nie jest zaszyfrowane przy użyciu dobrego algorytmu z dobrym kluczem.

1

SecureString jest dokładnie tym, co mówi ta nazwa, a ty ją zignorowałeś: Zapisuje ciąg również zaszyfrowany w pamięci, więc tak, to jest właściwy sposób.
Zobacz HERE:

Reprezentuje tekst, który powinien być przechowywany poufne. Tekst jest zaszyfrowany , aby zapewnić prywatność podczas używania, a został usunięty z pamięci komputera, gdy nie jest już potrzebny. Ta klasa nie może być odziedziczona po .

7

SecureString w pewien sposób zabezpiecza instancję pamięci w łańcuchu, jednak należy pamiętać o kilku znaczących wadach.

  • SecureString (tak jak wskazuje svick) mogą być pobierane bez klucza deszyfrowania, więc każdy haker wystarczające umiejętności, aby pobrać ten kawałek pamięci można bezpiecznie założyć, można łatwo wykonać tę niewielką operację, aby pobrać ciąg zwykły tekst . Należy wziąć pod uwagę prostotę: SecureStringToBSTR(input);
  • SecureString musi zostać wypełniony znak po znaku, ponieważ nie ma właściwości .Text Get or Set accessor do użycia. Na blogach oraz MSDN można często zobaczyć kod jak poniżej:

    public static SecureString StringToSecureString(string input) 
    { 
        SecureString output = new SecureString(); 
        int l = input.Length; 
        char[] s = input.ToCharArray(0, l); 
        foreach (char c in s) 
        { 
         output.AppendChar(c); 
        } 
        return output; 
    } 
    

Znaczący problem z tym kodem jest, że deweloper pozwolił ciąg input kiedykolwiek istnieć w pamięci w pierwszej kolejności.Kontrola użytkownika lub WinForm TextBox z PasswordBox wykorzystywane do zbierania tego hasła od użytkownika nigdy nie powinny zbierać całe hasło w jednej operacji, jak

  • Hakerzy mogą uzyskać dostęp do pamięci bezpośrednio i odzyskać hasło bezpośrednio od kontroli na stosie lub wstrzyknij kod, aby odzyskać hasło podczas tworzenia tej metody.
  • Jeśli ostatni zrzut pamięci nadal znajduje się na twoim komputerze z ostatniego niebieskiego ekranu, a ta kontrola została wypełniona zwykłym tekstem, hasło znajduje się w porządny mały plik gotowy do użycia przez Hackera w jego wolnym czasie.

Zamiast rozważyć opcje gdzie KeyPress jest używany do pobierania każdy znak od użytkownika, w przeciwnym razie PasswordBox WPF jest poparta SecureString domyślnie wierzę (ktoś może to potwierdzić).

Wreszcie istnieje wiele prostszych sposobów na zbieranie haseł od użytkowników takich jak Key Loggers. Moją rekomendacją jest uwzględnienie twojej grupy demograficznej, ryzyka ekspozycji i określenie, czy coś tak banalnego, jak , jako SecureString, naprawdę go zmniejszy.

+0

Właściwie zamierzam obniżyć tę odpowiedź, ponieważ zasugerowałeś, że kluczowy program rejestrujący jest skutecznym sposobem rozwiązania tego problemu. Keyloggery są zasadniczo przeciwko protokołom bezpieczeństwa, a każda odpowiedzialna korporacja natychmiast OGŁASZA każdego, kto napisał keylogger i umieścił go w środowisku produkcyjnym. Przejąłem zespół programistów, którzy zostali zwolnieni za to. Wszyscy stracili pracę. –

+0

Bardzo interesujące! –

+3

@ ScottShaw-Smith, wiem, że to jest stare, ale nie widzę, żeby sugerował użycie kluczyków jako "realnego sposobu na rozwiązanie tego problemu". Mówi raczej, że użycie SecureString + KeyPress nie pomoże w zabezpieczeniu hasła, jeśli hakerzy używają keyloggerów. –

-1

Wy, chłopaki, robicie DROGĘ zbyt skomplikowaną. Nikt nie zapytał, czy to najlepszy sposób na rozwiązanie problemu. Chcą tylko zobaczyć działający kod. Jezu. W tym przykładzie passwordPre jest ciągiem, który został odszyfrowany z zasobu (na przykład pliku konfiguracyjnego) przy użyciu własnego algorytmu deszyfrowania.

string passwordPre = DecryptProprietary(objectReferringToPassword); 
    char[] passwordChars = passwordPre.ToCharArray();   
    System.Security.SecureString securePassword = new System.Security.SecureString(); // in production, this should probably be a global variable 
    foreach (char c in passwordChars) 
     securePassword.AppendChar(c); 

    string decryptedPassword = new System.Net.NetworkCredential(string.Empty, securePassword).Password; // this is how to convert it to a string for quick usage to access the protected resource 

Szybkie użycie odszyfrowanego hasła w celu uzyskania dostępu do zasobów, których potrzebujesz, i pozbycie się go poprzez zamknięcie metody.

+0

uhhh .... zastrzeżony algorytm odszyfrowywania? –

Powiązane problemy