Bezpieczny magazyn
W tym artykule opisano sposób używania interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI). ISecureStorage
Ten interfejs ułatwia bezpieczne przechowywanie prostych par klucz/wartość.
Domyślna implementacja interfejsu ISecureStorage
jest dostępna za pośrednictwem SecureStorage.Default
właściwości . Zarówno interfejs, jak ISecureStorage
i SecureStorage
klasa są zawarte w Microsoft.Maui.Storage
przestrzeni nazw.
Rozpocznij
Aby uzyskać dostęp do SecureStorage funkcji, wymagana jest następująca konfiguracja specyficzna dla platformy:
Automatyczne tworzenie kopii zapasowych aplikacji to funkcja systemu Android 6.0 (poziom 23 interfejsu API) i nowsza, która wykonuje kopię zapasową danych aplikacji użytkownika (udostępnione preferencje, pliki w magazynie wewnętrznym aplikacji i inne określone pliki). Dane są przywracane po ponownym zainstalowaniu lub zainstalowaniu aplikacji na nowym urządzeniu. Może to mieć wpływ na SecureStorage
usługę , która korzysta z preferencji udostępniania, których kopia zapasowa jest tworzona i nie można jej odszyfrować po zakończeniu przywracania. Program .NET MAUI automatycznie obsługuje ten przypadek, usuwając klucz, aby można go było zresetować. Alternatywnie można wyłączyć automatyczne tworzenie kopii zapasowej.
Włączanie lub wyłączanie kopii zapasowej
Możesz wyłączyć automatyczną kopię zapasową dla całej aplikacji, ustawiając wartość android:allowBackup
false w pliku AndroidManifest.xml . Takie podejście jest zalecane tylko w przypadku planowania przywracania danych w inny sposób.
<manifest ... >
...
<application android:allowBackup="false" ... >
...
</application>
</manifest>
Selektywna kopia zapasowa
Automatyczne tworzenie kopii zapasowej można skonfigurować tak, aby wyłączyć tworzenie kopii zapasowej określonej zawartości. Można utworzyć niestandardowy zestaw reguł, aby wykluczyć SecureStore
elementy z kopii zapasowej.
android:fullBackupContent
Ustaw atrybut w AndroidManifest.xml:<application ... android:fullBackupContent="@xml/auto_backup_rules"> </application>
Utwórz nowy plik XML o nazwie auto_backup_rules.xml w katalogu Platformy/Android/Resources/xml za pomocą akcji kompilacji AndroidResource. Ustaw następującą zawartość, która zawiera wszystkie udostępnione preferencje z wyjątkiem :
SecureStorage
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="${applicationId}.microsoft.maui.essentials.preferences.xml"/> </full-backup-content>
Korzystanie z bezpiecznego magazynu
W poniższych przykładach kodu pokazano, jak używać bezpiecznego magazynu.
Napiwek
Istnieje możliwość, że wyjątek jest zgłaszany podczas wywoływania metody GetAsync
lub SetAsync
. Może to być spowodowane tym, że urządzenie nie obsługuje bezpiecznego magazynu, zmieniania kluczy szyfrowania lub uszkodzenia danych. Najlepiej to zrobić, usuwając i dodając ustawienie z powrotem, jeśli jest to możliwe.
Pisanie wartości
Aby zapisać wartość dla danego klucza w bezpiecznym magazynie:
await SecureStorage.Default.SetAsync("oauth_token", "secret-oauth-token-value");
Odczytywanie wartości
Aby pobrać wartość z bezpiecznego magazynu:
string oauthToken = await SecureStorage.Default.GetAsync("oauth_token");
if (oauthToken == null)
{
// No value is associated with the key "oauth_token"
}
Napiwek
Jeśli nie ma wartości skojarzonej z kluczem, GetAsync
zwraca wartość null
.
Usuwanie wartości
Aby usunąć określoną wartość, usuń klucz:
bool success = SecureStorage.Default.Remove("oauth_token");
Aby usunąć wszystkie wartości, użyj RemoveAll
metody :
SecureStorage.Default.RemoveAll();
Różnice między platformami
W tej sekcji opisano różnice specyficzne dla platformy dotyczące bezpiecznego interfejsu API magazynu.
SecureStorage
używa interfejsu API preferencji i jest zgodny z tą samą trwałością danych opisaną w dokumentacji Preferencji z nazwą pliku [YOUR-APP-PACKAGE-ID].microsoft.maui.essentials.preferences. Jednak dane są szyfrowane przy użyciu klasy systemu Android z biblioteki zabezpieczeń systemu Android EncryptedSharedPreferences
, która opakowuje klasę i automatycznie szyfruje SharedPreferences
klucze i wartości przy użyciu podejścia dwu schema:
- Klucze są deterministycznie szyfrowane, dzięki czemu klucz można zaszyfrować i prawidłowo wyszukać.
- Wartości są niedeterministyczne szyfrowane przy użyciu usługi AES-256 GCM.
Aby uzyskać więcej informacji na temat biblioteki zabezpieczeń systemu Android, zobacz Praca z danymi bezpieczniej na developer.android.com.
Ograniczenia
Wydajność może mieć wpływ na przechowywanie dużych ilości tekstu, ponieważ interfejs API został zaprojektowany do przechowywania małych ilości tekstu.