flutter_secure_storage
一个用于将数据存储在安全存储中的 Flutter 插件
- Keychain 用于 iOS
- AES 加密用于 Android。AES 密钥使用 RSA 加密,RSA 密钥存储在 KeyStore 中
- 使用 V5.0.0,我们可以在 Android 上使用 EncryptedSharedPreferences,方法是在 Android Options 中启用它,如下所示
AndroidOptions _getAndroidOptions() => const AndroidOptions(
encryptedSharedPreferences: true,
);
有关更多信息,请参阅示例应用。
libsecret用于 Linux。
注意 KeyStore 于 Android 4.3 (API level 18) 引入。插件将不适用于早期版本。
平台实现
请注意,此表显示了此存储库中实现的功能,并且可能尚未在 pub.dev 上发布更改。
| 读取 | 写入 | delete | 包含键 | 读取所有 | 删除所有 | |
|---|---|---|---|---|---|---|
| Android | ||||||
| iOS | ||||||
| Windows | ||||||
| Linux | ||||||
| macOS | ||||||
| Web |
入门
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
// Create storage
final storage = new FlutterSecureStorage();
// Read value
String value = await storage.read(key: key);
// Read all values
Map<String, String> allValues = await storage.readAll();
// Delete value
await storage.delete(key: key);
// Delete all
await storage.deleteAll();
// Write value
await storage.write(key: key, value: value);
这使我们能够在应用处于后台时获取安全值,方法是指定 first_unlock 或 first_unlock_this_device。如果未指定,则默认值为 unlocked。
一个例子
final options = IOSOptions(accessibility: IOSAccessibility.first_unlock);
await storage.write(key: key, value: value, iOptions: options);
配置 Android 版本
在 [project]/android/app/build.gradle 中将 minSdkVersion 设置为 >= 18。
android {
...
defaultConfig {
...
minSdkVersion 18
...
}
}
注意 默认情况下,Android 会在 Google Drive 上备份数据。这可能导致异常 java.security.InvalidKeyException:Failed to unwrap key。
您需要
- 禁用自动备份,详情
- 排除 FlutterSecureStorage 使用的 sharedprefs 插件,详情
配置 Web 版本
Flutter Secure Storage 使用实验性的 WebCrypto 实现。目前请自行承担风险使用。目的是浏览器创建私钥,因此,local_storage 中的加密字符串不能移植到其他浏览器或其他机器,并且仅在同一域下有效。
启用 HTTP 严格前向保密和为您的响应应用适当的标头非常重要,否则您可能会受到 JavaScript 劫持的攻击。
请参阅
- https://mdn.org.cn/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
- https://www.netsparker.com/blog/web-security/http-security-headers/
配置 Linux 版本
您需要在您的机器上安装 libsecret-1-dev 和 libjsoncpp-dev 来构建项目,并需要 libsecret-1-0 和 libjsoncpp1 来运行应用程序(在打包您的应用程序后将其添加为依赖项)。如果您使用 snapcraft 构建项目,请按以下方式操作:
parts:
uet-lms:
source: .
plugin: flutter
flutter-target: lib/main.dart
build-packages:
- libsecret-1-dev
- libjsoncpp-dev
stage-packages:
- libsecret-1-dev
- libjsoncpp1-dev
配置 MacOS 版本
您还需要将 Keychain Sharing 添加为 macOS runner 的功能。
集成测试
从 example 目录运行以下命令:
flutter drive --target=test_driver/app.dart