本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) ISecureStorage 接口。 此接口有助于安全存储简单的键/值对。
ISecureStorage 接口的默认实现通过 SecureStorage.Default 属性提供。
ISecureStorage 接口和 SecureStorage 类都包含在 Microsoft.Maui.Storage 命名空间中。
开始
要访问 SecureStorage 功能,需要进行以下平台特定的设置:
- Android
- iOS/Mac Catalyst
- Windows
应用自动备份 是 Android 6.0(API 级别 23)及更高版本的功能,可备份用户的应用数据(共享偏好设置、应用的内部存储中的文件和其他特定文件)。 在新设备上重新安装或安装应用时,数据将被还原。 这可能会影响使用共享首选项的SecureStorage,这些首选项已备份但在还原时无法解密。 .NET MAUI 通过删除密钥自动处理此情况,以便可以重置密钥。 或者,可以禁用自动备份。
启用或禁用备份
您可以选择在
<manifest ... >
...
<application android:allowBackup="false" ... >
...
</application>
</manifest>
选择性备份
可以将自动备份配置为禁止备份特定内容。 可以创建自定义规则集以排除 SecureStore 项目不进行备份。
在您的
AndroidManifest.xml 中设置属性: <application ... android:fullBackupContent="@xml/auto_backup_rules"> </application>使用 AndroidResource 的生成操作在 Platforms/Android/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}.microsoft.maui.essentials.preferences.xml"/> </full-backup-content>
使用安全存储
下面的代码示例展示如何使用安全存储。
提示
调用 GetAsync 或 SetAsync 时,可能会引发异常。 这可能是由于设备不支持安全存储、加密密钥更改或数据损坏等原因造成。 最好通过移除并重新添加设置(如果可能)的方式处理这种情况。
写入值
将给定密钥的值保存在安全存储中:
await SecureStorage.Default.SetAsync("oauth_token", "secret-oauth-token-value");
读取值
从安全存储中检索值:
string oauthToken = await SecureStorage.Default.GetAsync("oauth_token");
if (oauthToken == null)
{
// No value is associated with the key "oauth_token"
}
提示
如果没有与键关联的值,则 GetAsync 返回 null。
删除值
若要删除特定值,请删除密钥:
bool success = SecureStorage.Default.Remove("oauth_token");
要移除所有值,请使用 RemoveAll 方法:
SecureStorage.Default.RemoveAll();
平台差异
本部分描述了安全存储 API 的平台特定差异。
- Android
- iOS/Mac Catalyst
- Windows
SecureStorage 使用 首选项 API,并遵循 首选项 文档中概述的相同数据持久性,文件名为 [YOUR-APP-PACKAGE-ID].microsoft.maui.essentials.preferences。 但是,数据使用 Android 安全库中的 EncryptedSharedPreferences 类进行加密,该库包装了 SharedPreferences 类,并采用双方案方法自动加密密钥和值:
- 密钥经过确定性加密,以确保密钥可以被加密后仍可正确查找。
- 使用 AES-256 GCM 对值进行非确定性加密。
有关 Android 安全库的详细信息,请参阅 developer.android.com 上的 更安全地处理数据。
警告
当 Android 自动备份将加密首选项还原到新设备时,不会传输原始加密密钥,这意味着无法解密还原的值。 .NET MAUI 会在发生这种情况时自动删除受影响的密钥,但对仍缓存损坏值的任何 GetAsync 调用都可能会引发异常。 始终将安全存储调用包装在 try/catch 中,并调用 RemoveAll 以清除任何不可读的值。
try
{
var value = await SecureStorage.Default.GetAsync("auth_token");
}
catch (Exception)
{
// Encrypted values from backup can't be decrypted on this device —
// clear all secure values so they can be re-entered or re-fetched.
SecureStorage.Default.RemoveAll();
}
若要完全防止问题,请使用选择性备份来排除 SecureStorage 首选项文件 , 请参阅上述设置部分中的 选择性备份 。
限制
如果存储大量文本,性能可能会受到影响,因为 API 旨在存储少量文本。
浏览示例