Xamarin.Essentials: безопасное хранилище
Класс SecureStorage помогает обеспечить безопасное хранение пар "ключ-значение".
Начало работы
Чтобы начать использовать этот API, ознакомьтесь с руководством по началу работы с Xamarin.Essentials, чтобы правильно настроить и установить библиотеку в проектах.
Чтобы проверить функциональность класса SecureStorage, нужно создать описанную ниже конфигурацию для конкретной платформы.
Совет
Auto Backup for Apps (Автоматическое резервное копирование для приложений) — это функция Android 6.0 (API уровня 23) и более поздних версий, которая создает резервные копии пользовательских данных из приложения (общие параметры, файлы во внутреннем хранилище приложения, некоторые другие файлы). Эти данные восстанавливаются при повторной установке приложения на том же или на новом устройстве. Это может повлиять на класс SecureStorage
, который использует сохраненные общие параметры и не может быть расшифрован при восстановлении. Xamarin.Essentials автоматически учитывает этот случай и удаляет этот ключ, чтобы его можно было сбросить. Но вы можете принять дополнительные меры предосторожности и отключить автоматическое резервное копирование.
Включение и отключение резервного копирования
Вы можете отключить автоматическое резервное копирование для всего приложения, присвоив значение false параметру android:allowBackup
в файле AndroidManifest.xml
. Мы рекомендуем использовать такой метод, только если вы планируете организовать другой способ восстановления данных.
<manifest ... >
...
<application android:allowBackup="false" ... >
...
</application>
</manifest>
Выборочные резервные копии
Вы можете исключить из автоматического резервного копирования определенное содержимое. Можно создать настраиваемое правило, которое исключает элементы SecureStore
из процесса резервного копирования.
Настройте атрибут
android:fullBackupContent
в файле AndroidManifest.xml:<application ... android:fullBackupContent="@xml/auto_backup_rules"> </application>
Создайте файл XML с именем auto_backup_rules.xml в каталоге Resources/xml с действием сборки AndroidResource. Затем настройте следующее содержимое, которое включает все общие параметры, кроме
SecureStorage
:<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="${applicationId}.xamarinessentials.xml"/> </full-backup-content>
Использование защищенного хранилища
Добавьте ссылку на Xamarin.Essentials в своем классе:
using Xamarin.Essentials;
Чтобы сохранить значение определенного ключа в защищенное хранилище, используйте следующий код:
try
{
await SecureStorage.SetAsync("oauth_token", "secret-oauth-token-value");
}
catch (Exception ex)
{
// Possible that device doesn't support secure storage on device.
}
Чтобы извлечь значение из защищенного хранилища, используйте следующий код:
try
{
var oauthToken = await SecureStorage.GetAsync("oauth_token");
}
catch (Exception ex)
{
// Possible that device doesn't support secure storage on device.
}
Примечание.
Если для запрошенного ключа нет сохраненного значения, команда GetAsync
вернет значение null
.
Чтобы удалить один конкретный ключ, используйте следующий вызов:
SecureStorage.Remove("oauth_token");
Чтобы удалить все ключи, используйте следующий вызов:
SecureStorage.RemoveAll();
Совет
При вызове GetAsync
или SetAsync
может возникнуть исключение. Это может быть вызвано тем, что устройство не поддерживает безопасное хранение, изменение ключей шифрования или повреждение данных. Лучше всего справиться с этим, удалив и добавив параметр обратно, если это возможно.
Особенности реализации для платформ
Хранилище ключей Android используется для хранения ключа шифрования, с помощью которого значения шифруются перед сохранением в общие параметры с именем файла [идентификатор_пакета_приложения].xamarinessentials. Ключ (не криптографический, а ключ для значения), используемый в файле общих параметров, представляет собой хэш MD5 ключа, передаваемого в API SecureStorage
.
API уровня 23 и более поздних версий
В API новых уровней ключ AES извлекается из хранилища ключей Android и применяется с шифром AES/GCM/NoPadding для шифрования значения перед сохранением в файл общих параметров.
API уровня 22 и более ранних версий
В API более старых уровней хранилище ключей Android поддерживает только хранение ключей RSA, которые применяются с шифром RSA/ECB/PKCS1Padding для шифрования ключа AES (созданного случайным образом во время выполнения) и сохранения полученного значения в файле общих параметров в разделе SecureStorageKey, если такой ключ еще не был создан.
SecureStorage использует API-интерфейс предпочтений и применяет правила сохраняемости данных, которые описаны в документации по классу Preferences. При обновлении устройств с API уровня 22 или ниже до API уровня 23 или выше сохраняется указанный тип шифрования, если приложение не было удалено и (или) не был вызван метод RemoveAll.
Ограничения
Этот API предназначен для хранения небольших объемов текста. Производительность может быть низкой, если сохранять большие объемы текста.