Flutter安全资源存储插件resource_storage_secure的使用

Flutter安全资源存储插件resource_storage_secure的使用

pub package

简单实现 cached_resource 包的安全持久化资源存储,基于 flutter_secure_storage

组件

  1. <code>FlutterSecureResourceStorage</code>:基于 flutter_secure_storage 的安全持久化资源存储。
  2. <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

1 回复

更多关于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. 存储资源

使用 ResourceStorageSecurewrite 方法来存储敏感资源。

void storeSensitiveData() async {
  String key = "my_secret_key";
  String value = "my_sensitive_data";
  await ResourceStorageSecure.write(key: key, value: value);
}

5. 读取资源

使用 ResourceStorageSecureread 方法来读取存储的敏感资源。

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. 删除资源

使用 ResourceStorageSecuredelete 方法来删除存储的敏感资源。

void deleteSensitiveData() async {
  String key = "my_secret_key";
  await ResourceStorageSecure.delete(key: key);
}

7. 检查资源是否存在

使用 ResourceStorageSecurecontainsKey 方法来检查某个密钥是否已经存储了资源。

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. 清除所有资源

使用 ResourceStorageSecureclear 方法来清除所有存储的敏感资源。

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");
}
回到顶部