2008-09-30 18 views
15

Potrzebuję przechowywać zaszyfrowane dane (kilka małych ciągów) między uruchomieniami aplikacji. Nie chcę, aby użytkownik podawał hasło za każdym razem, gdy uruchamia aplikację. To znaczy. ostatecznie wszystko idzie w dół do bezpiecznego przechowywania klucza (ów) szyfrowania.Trwałe przechowywanie zaszyfrowanych danych przy użyciu .Net

Szukałem w RSACryptoServiceProvider i przy użyciu PersistentKeyInCsp, ale nie jestem pewien, jak to działa. Czy kluczowy pojemnik jest trwały między uruchomieniami aplikacji lub ponownymi uruchomieniami maszyny? Jeśli tak, czy jest to specyficzne dla użytkownika, czy specyficzne dla maszyny. To znaczy. czy przechowuję zaszyfrowane dane w profilu mobilnym użytkownika, czy mogę odszyfrować dane, jeśli użytkownik loguje się na innym komputerze?

Jeśli powyższe nie działa, jakie są moje opcje (muszę zajmować się profilami mobilnymi).

Odpowiedz

35

Interfejs API Data Protection (DPAPI) wykonuje dokładnie to, co chcesz. Zapewnia symetryczne szyfrowanie dowolnych danych, wykorzystując poświadczenia maszyny lub (lepiej) użytkownika, jako klucz szyfrowania. Nie musisz się martwić o zarządzanie kluczami; Windows się tym zaopiekuje. Jeśli użytkownik zmieni swoje hasło, system Windows ponownie zaszyfruje dane, używając nowego hasła użytkownika.

DPAPI jest narażona w NET z klasy System.Security.Cryptography.ProtectedData:

byte[] plaintextBytes = GetDataToProtect(); 
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser); 

Drugi parametr sposobu ochrona jest opcjonalną tablicę entropia bajtów, które mogą być wykorzystane jako dodatkowe zastosowanie -specyficzny "sekret".

Aby odszyfrować, użyj połączenia ProtectedData.Unprotect:

byte[] encodedBytes = GetDataToUnprotect(); 
byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser); 

DPAPI działa poprawnie z profili mobilnych (jak opisano here), choć trzeba do przechowywania zaszyfrowanych danych w miejscu (udziału sieciowego, IsolatedStorage z IsolatedStorageScope.Roaming itd.), Do której mają dostęp różne twoje komputery.

Zobacz klasę ProtectedData w witrynie MSDN, aby uzyskać więcej informacji. Dostępny jest biały dokument DPAPI here, zawierający więcej informacji, niż kiedykolwiek chciałeś.

+0

Tylko dla potomnych, trzeba zajrzeć do innego kodu do obsługi utrzymującej go gdzieś dalej „publiczne” (przynajmniej w intranecie, na przykład), więc można dostać się do niej z inne maszyny. Zwykle można użyć Environment.SpecialFolder.ApplicationData, aby uzyskać lokalizację specyficzną dla maszyny i użytkownika. –

+0

Dzięki za odpowiedź, to powinno zadziałać. Czy masz pojęcie, jak to zrobić w wersji 1.1? ProtectedData jest nowy dla .Net 2.0 –

+1

Aby używać DPAPI w .NET 1.1, musisz użyć P/Invoke.Zobacz tutaj całkiem kompletny przebieg: http://msdn.microsoft.com/en-us/library/aa302402.aspx –

0

Chciałbym dodać do podejścia DPAPI.

Chociaż nie zaimplementowałem samemu podejścia do sklepu użytkownika, istnieje dokumentacja firmy Microsoft dotycząca podejścia do sklepu użytkownika, który szyfruje i odszyfrowuje dane dla określonego użytkownika.

Użyłem DPAPI używając magazynu maszynowego. Opiszę to na wypadek, gdyby pasował do tego, co chcesz zrobić. Użyłem usługi systemu Windows do załadowania profilu użytkownika systemu Windows, a hasło tego użytkownika służy do szyfrowania danych.

Na marginesie, DPAPI używa Triple-DES, który może być nieco słabszy (niż AES), ale nie jestem pewien, jakiego rodzaju ochrony szukasz. Ochrona

Okna danych http://msdn.microsoft.com/en-us/library/ms995355.aspx