Flutter安全资源存储插件resource_storage_secure的使用
Flutter安全资源存储插件resource_storage_secure的使用
简单实现 cached_resource
包的安全持久化资源存储,基于 flutter_secure_storage
。
组件
<code>FlutterSecureResourceStorage</code>
:基于flutter_secure_storage
的安全持久化资源存储。<code>FlutterSecureResourceStorageProvider</code>
:用于配置cached_resource
的工厂。
注意:在Android上的使用
注意:在Android上,如果未为 [FlutterSecureResourceStorage]
提供自定义 storage
配置,则所有数据将使用 EncryptedSharedPreferences
存储在一个名为 resource_storage
的文件中(参见 kResourceStorageEncryptedSharedPrefsName
常量)。默认情况下,Android会在Google Drive上备份数据,这可能会导致异常 java.security.InvalidKeyException:Failed to unwrap key
。您需要:
完整示例
以下是一个完整的示例,演示如何使用 FlutterSecureResourceStorage
插件进行安全资源存储。
import 'package:flutter/material.dart';
import 'package:resource_storage/resource_storage.dart';
import 'package:resource_storage_secure/resource_storage_secure.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Secure Storage Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return SizedBox.expand(
child: Center(
child: ElevatedButton(
child: const Text('Open Demo Page'),
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => const DemoPage()));
},
),
),
);
}
}
class DemoPage extends StatefulWidget {
const DemoPage({super.key});
[@override](/user/override)
State<DemoPage> createState() => _DemoPageState();
}
class _DemoPageState extends State<DemoPage> {
Value _value1 = Value(0);
Value _value2 = Value(0);
late FlutterSecureResourceStorage<String, Value> _storage1;
late FlutterSecureResourceStorage<String, Value> _storage2;
[@override](/user/override)
void initState() {
super.initState();
_storage1 = FlutterSecureResourceStorage<String, Value>(
storageName: 'value_1',
decode: Value.fromJson,
logger: const ResourceLogger(),
);
_storage2 = FlutterSecureResourceStorage<String, Value>(
storageName: 'value_2',
decode: Value.fromJson,
logger: const ResourceLogger(),
);
_refreshCounter1();
_refreshCounter2();
}
void _refreshCounter1() async {
final cache = await _storage1.getOrNull('counter');
setState(() {
_value1 = cache?.value ?? Value(0);
});
}
void _refreshCounter2() async {
final cache = await _storage2.getOrNull('counter');
setState(() {
_value2 = cache?.value ?? Value(0);
});
}
void _incrementCounters() async {
await _storage1.put('counter', _value1 + 1);
_refreshCounter1();
await _storage2.put('counter', _value2 + 1);
_refreshCounter2();
}
void _resetStorage1() async {
await _storage1.clear();
_refreshCounter1();
}
void _resetStorage2() async {
await _storage2.clear();
_refreshCounter2();
}
void _resetAllStorages() async {
// 清除所有存储:storage1 和 storage2。
await _storage1.clearAllStorage();
_refreshCounter1();
_refreshCounter2();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text('Demo page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Counter 1:'),
Text(
'${_value1.counter}',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _resetStorage1,
child: const Text('重置存储 1'),
),
const SizedBox(height: 60),
const Text('Counter 2:'),
Text(
'${_value2.counter}',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _resetStorage2,
child: const Text('重置存储 1'),
),
const SizedBox(height: 40),
ElevatedButton(
onPressed: _resetAllStorages,
child: const Text('重置所有'),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounters,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
class Value {
Value(this.counter);
final int counter;
Value operator +(int a) => Value(counter + a);
[@override](/user/override)
String toString() => 'Value($counter)';
Map<String, dynamic> toJson() {
return {
'counter': counter,
};
}
factory Value.fromJson(dynamic json) {
final map = json as Map<String, dynamic>;
return Value(map['counter'] as int);
}
}
更多关于Flutter安全资源存储插件resource_storage_secure的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter安全资源存储插件resource_storage_secure的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,resource_storage_secure
是一个用于安全存储敏感资源(如密钥、凭证等)的插件。它通常用于保护应用程序中的敏感信息,防止被恶意访问或篡改。以下是如何使用 resource_storage_secure
插件的基本指南。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 resource_storage_secure
依赖:
dependencies:
flutter:
sdk: flutter
resource_storage_secure: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 resource_storage_secure
插件:
import 'package:resource_storage_secure/resource_storage_secure.dart';
3. 初始化插件
在使用插件之前,通常需要初始化它。你可以在 main
函数中或应用程序启动时进行初始化。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await ResourceStorageSecure.initialize();
runApp(MyApp());
}
4. 存储资源
使用 ResourceStorageSecure
的 write
方法来存储敏感资源。
void storeSensitiveData() async {
String key = "my_secret_key";
String value = "my_sensitive_data";
await ResourceStorageSecure.write(key: key, value: value);
}
5. 读取资源
使用 ResourceStorageSecure
的 read
方法来读取存储的敏感资源。
void readSensitiveData() async {
String key = "my_secret_key";
String? value = await ResourceStorageSecure.read(key: key);
if (value != null) {
print("Stored value: $value");
} else {
print("No value found for the key: $key");
}
}
6. 删除资源
使用 ResourceStorageSecure
的 delete
方法来删除存储的敏感资源。
void deleteSensitiveData() async {
String key = "my_secret_key";
await ResourceStorageSecure.delete(key: key);
}
7. 检查资源是否存在
使用 ResourceStorageSecure
的 containsKey
方法来检查某个密钥是否已经存储了资源。
void checkIfKeyExists() async {
String key = "my_secret_key";
bool exists = await ResourceStorageSecure.containsKey(key: key);
if (exists) {
print("Key exists");
} else {
print("Key does not exist");
}
}
8. 清除所有资源
使用 ResourceStorageSecure
的 clear
方法来清除所有存储的敏感资源。
void clearAllData() async {
await ResourceStorageSecure.clear();
}
9. 处理异常
在使用插件时,建议处理可能的异常,例如存储失败或读取失败。
try {
await ResourceStorageSecure.write(key: "my_key", value: "my_value");
} catch (e) {
print("Failed to store data: $e");
}