Tworzę aplikację Windows, do której musisz się najpierw zalogować.
Szczegóły konta składają się z nazwy użytkownika i hasła i muszą być zapisane lokalnie.
To tylko kwestia bezpieczeństwa, więc inne osoby korzystające z tego samego komputera nie widzą danych osobowych wszystkich.
Jaki jest najlepszy / najbezpieczniejszy sposób zapisywania tych danych?
Nie chcę używać bazy danych, więc wypróbowałem kilka rzeczy z plikami zasobów.
Ale ponieważ jestem w tym trochę nowy, nie jestem do końca pewien, co robię i gdzie powinienem szukać rozwiązania.
Odpowiedzi:
Jeśli zamierzasz tylko zweryfikować / zweryfikować wprowadzoną nazwę użytkownika i hasło, użyj klasy Rfc2898DerivedBytes (znanej również jako funkcja 2 wyprowadzania klucza opartego na haśle lub PBKDF2). Jest to bezpieczniejsze niż użycie szyfrowania, takiego jak Triple DES lub AES, ponieważ nie ma praktycznego sposobu, aby przejść od wyniku RFC2898DerivedBytes z powrotem do hasła. Możesz przejść tylko od hasła do wyniku. Zobacz Czy można używać skrótu SHA1 hasła jako soli podczas wyprowadzania klucza szyfrowania i IV z ciągu hasła? na przykład i dyskusja dla .Net lub String szyfruj / odszyfruj z hasłem c # Metro Style dla WinRT / Metro.
Jeśli przechowujesz hasło w celu ponownego użycia, na przykład przekazania go stronie trzeciej, użyj interfejsu API ochrony danych systemu Windows (DPAPI) . Wykorzystuje on wygenerowane i chronione przez system operacyjny klucze oraz algorytm szyfrowania Triple DES do szyfrowania i odszyfrowywania informacji. Oznacza to, że Twoja aplikacja nie musi martwić się o generowanie i ochronę kluczy szyfrowania, co jest głównym problemem podczas korzystania z kryptografii.
W języku C # użyj klasy System.Security.Cryptography.ProtectedData . Na przykład, aby zaszyfrować fragment danych, użyj
ProtectedData.Protect()
:Przechowuj bezpiecznie entropię i szyfrogram, na przykład w pliku lub kluczu rejestru z ustawionymi uprawnieniami, aby tylko bieżący użytkownik mógł je odczytać. Aby uzyskać dostęp do oryginalnych danych, użyj
ProtectedData.Unprotect()
:Zwróć uwagę, że istnieją dodatkowe względy bezpieczeństwa. Na przykład unikaj przechowywania sekretów, takich jak hasła, jako plik
string
. Ciągi znaków są niezmienne, ponieważ nie można ich powiadamiać w pamięci, więc ktoś przeglądający pamięć aplikacji lub zrzut pamięci może zobaczyć hasło. Zamiast tego użyj SecureString lub byte [] i pamiętaj, aby je usunąć lub wyzerować, gdy tylko hasło nie będzie już potrzebne.źródło
ProtectedData
jest taki, że nie muszę się martwić o bezpieczne przechowywanie entropii i szyfrogramu, ... więc tylko bieżący użytkownik może je odczytać . Myślę, że oferuje prostotę, ponieważ mogę je przechowywać, ale jest wygodny i nadal tylko CurrentUser może je odszyfrować.entropy
Parametr jest opcjonalny i pojawia się podobny do IV, w którym liczy się bardziej niż wyjątkowość tajemnicy. W związku z tym wartość mogłaby prawdopodobnie zostać pominięta lub na stałe zakodowana w programie w sytuacjach, w których zmiana i aktualizacja tekstu jawnego są rzadkie.Używałem tego wcześniej i myślę, że aby upewnić się, że poświadczenia są trwałe i w jak najbardziej bezpieczny sposób
ConfigurationManager
klasySecureString
klasyCryptography
przestrzeni nazw.Mam nadzieję, że ten link będzie bardzo pomocny: Kliknij tutaj
źródło
DPAPI jest właśnie do tego celu. Użyj DPAPI do zaszyfrowania hasła przy pierwszym wejściu użytkownika, przechowuj je w bezpiecznej lokalizacji (rejestr użytkownika, katalog danych aplikacji użytkownika, to tylko niektóre opcje). Za każdym razem, gdy aplikacja jest uruchamiana, sprawdź lokalizację, aby zobaczyć, czy twój klucz istnieje, jeśli używa DPAPI do odszyfrowania go i zezwolenia na dostęp, w przeciwnym razie odmów.
źródło
Działa to tylko w systemie Windows, więc jeśli planujesz korzystać z platformy dotnet core na wielu platformach, musisz szukać gdzie indziej. Zobacz https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md
źródło
Chciałem zaszyfrować i odszyfrować ciąg jako czytelny ciąg.
Oto bardzo prosty, szybki przykład w C # Visual Studio 2019 WinForms oparty na odpowiedzi z
@Pradip
.Kliknij prawym przyciskiem myszy projekt> właściwości> ustawienia> Utwórz
username
ipassword
ustawienie.Teraz możesz wykorzystać właśnie utworzone ustawienia. Tutaj zapisuję
username
ipassword
szyfruję tylkopassword
w odpowiednim polu wartości wuser.config
pliku.Przykład zaszyfrowanego ciągu znaków w
user.config
pliku.Pełny kod
źródło