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()
:
// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext;
// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(entropy);
}
byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
DataProtectionScope.CurrentUser);
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()
:
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
DataProtectionScope.CurrentUser);
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.