Xamarin.Essentials:安全存储
SecureStorage 类有助于安全地存储简单的键/值对。
入门
若要开始使用此 API,请阅读 Xamarin.Essentials 的入门指南,确保在项目中正确安装和设置库。
若要访问 SecureStorage 功能,需要以下特定于平台的设置:
提示
应用的自动备份是 Android 6.0(API 级别 23)及更高版本的功能,可备份用户的应用数据(共享首选项、应用的内部存储中的文件和其他特定文件)。 在新设备上重新安装或安装应用时,会还原数据。 这可能会影响使用共享首选项(已备份但在还原时无法解密)的 SecureStorage
。 Xamarin.Essentials 可通过删除键(以便可以进行重置)自动处理这种情况,但你可以通过禁用自动备份来采取其他步骤。
启用或禁用备份
可以选择通过在 AndroidManifest.xml
文件中将 android:allowBackup
设置设为 false,为整个应用程序禁用自动备份。 仅当计划按另一种方式还原数据时才建议使用此方法。
<manifest ... >
...
<application android:allowBackup="false" ... >
...
</application>
</manifest>
选择性备份
可以将自动备份配置为禁止备份特定内容。 可以创建自定义规则集以禁止备份 SecureStore
项。
在你的 AndroidManifest.xml 中设置
android:fullBackupContent
属性:<application ... android:fullBackupContent="@xml/auto_backup_rules"> </application>
使用 AndroidResource 的生成操作在 Resources/xml 目录中创建名为 auto_backup_rules.xml 的新 XML 文件。 然后设置以下内容,包括除
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>
使用 Secure Storage
在类中添加对 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 密钥存储用来存储用于在将值保存到文件名为 [你的应用包 ID].xamarinessentials 的共享首选项中之前加密值的加密密钥。 共享首选项文件中所使用的键(非加密密钥,指值的密钥)是传递到 SecureStorage
API 的密钥的 MD5 哈希。
API 级别 23 及更高版本
在较新的 API 级别上,AES 密钥是从 Android 密钥存储中获得的,并与 AES/GCM/NoPadding 密码结合使用以在将值存储在共享首选项文件中之前加密值。
API 级别 22 及更高版本
在较旧的 API 级别上,Android 密钥存储仅支持存储 RSA 密钥,这些密钥与 RSA/ECB/PKCS1Padding 密码结合使用以加密 AES 密钥(运行时随机生成),并且存储在密钥 SecureStorageKey 下的共享首选项文件中(如果尚未生成一个)。
SecureStorage 使用首选项 API,并遵循首选项文档中所述的相同数据持久性。 如果设备从 API 级别 22 或更低级别升级到 API 级别 23 及更高版本,则将继续使用此类型的加密,除非卸载该应用或调用 RemoveAll。
限制
此 API 用于存储少量文本。 如果尝试将其用于存储大量文本,则可能会降低性能。