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 项。

  1. 在你的 AndroidManifest.xml 中设置 android:fullBackupContent 属性:

    <application ...
        android:fullBackupContent="@xml/auto_backup_rules">
    </application>
    
  2. 使用 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();

提示

调用 GetAsyncSetAsync 时,可能会引发异常。 这可能是由于设备不支持安全存储、加密密钥更改或数据损坏等原因造成。 最好通过移除并重新添加设置(如果可能)来处理这种情况。

平台实现细节

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 用于存储少量文本。 如果尝试将其用于存储大量文本,则可能会降低性能。

API

第 9 频道YouTube 上查找更多 Xamarin 视频。