Flutter安全存储插件native_secured_storage的使用

发布于 1周前 作者 eggper 来自 Flutter

以下是关于“Flutter安全存储插件native_secured_storage的使用”的详细内容:


Flutter安全存储插件native_secured_storage的使用

native_secured_storage 是一个为 Flutter 设计的安全存储插件,用于使用 Android KeystoreiOS Keychain 安全地存储和检索原始数据类型(intdoubleboolString)。这确保了数据在静止时被加密,并且即使设备被破解也能防止未经授权的访问。


为什么使用 native_secured_storage

安全特性

  1. Android Keystore 使用 EncryptedSharedPreferences

    • 使用 AES256 加密,并将唯一密钥安全地存储在 Android Keystore 中。
    • 确保加密和解密仅在设备上进行。
  2. iOS Keychain

    • 直接集成到 Apple 的 Keychain 中,为敏感数据提供系统级安全性。
    • 如果可用,使用设备的 Secure Enclave 保护数据。
  3. 不存储明文

    • 所有数据在保存之前都会被加密,确保敏感信息永远不会以明文形式存储。
  4. 平台隔离

    • Android 和 iOS 分别实现确保数据在每个平台的原生环境中安全存储。

使用场景

  • 认证: 安全地存储令牌、密码或敏感用户凭据。
  • 偏好设置: 保存加密的应用程序偏好设置,如用户设置或功能标志。
  • 安全标识符: 存储应用程序逻辑所需的唯一标识符或密钥。

特性

  • 跨平台: 支持 Android 和 iOS。
  • 类型支持: 安全处理 intdoubleboolString 类型。
  • 易于使用的 API: 提供简化 Dart API 用于保存、检索和删除数据。
  • 错误处理: 全面的错误处理机制,以便在加密或存储操作期间捕捉问题。

安装

在你的 pubspec.yaml 文件中添加 native_secured_storage

dependencies:
  native_secured_storage: ^1.0.0

运行以下命令来安装包:

flutter pub get

使用方法

导入库

import 'package:native_secured_storage/native_secured_storage.dart';

保存值

await NativeSecuredStorage.save('key_name', 123); // 保存整数
await NativeSecuredStorage.save('key_name', 45.67); // 保存双精度浮点数
await NativeSecuredStorage.save('key_name', true); // 保存布尔值
await NativeSecuredStorage.save('key_name', 'Hello World'); // 保存字符串

检索值

final value = await NativeSecuredStorage.retrieve('key_name');
if (value != null) {
  print('Retrieved value: $value');
} else {
  print('No value found for the given key.');
}

删除值

await NativeSecuredStorage.delete('key_name');
print('Value deleted successfully.');

示例

以下是一个完整的示例,展示了如何使用 native_secured_storage 插件:

import 'package:flutter/material.dart';
import 'package:native_secured_storage/native_secured_storage.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Native Secured Storage Example',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: SecureStorageDemo(),
    );
  }
}

class SecureStorageDemo extends StatefulWidget {
  [@override](/user/override)
  _SecureStorageDemoState createState() => _SecureStorageDemoState();
}

class _SecureStorageDemoState extends State<SecureStorageDemo> {
  final TextEditingController _keyController = TextEditingController();
  final TextEditingController _valueController = TextEditingController();
  String? _retrievedValue;

  Future<void> _saveValue() async {
    final key = _keyController.text;
    final value = _valueController.text;

    if (key.isEmpty || value.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Key and value cannot be empty')),
      );
      return;
    }

    // 检测值类型以进行保存
    dynamic parsedValue;
    if (value.toLowerCase() == 'true' || value.toLowerCase() == 'false') {
      parsedValue = value.toLowerCase() == 'true';
    } else if (double.tryParse(value) != null) {
      parsedValue = value.contains('.') ? double.parse(value) : int.parse(value);
    } else {
      parsedValue = value;
    }

    try {
      await NativeSecuredStorage.save(key, parsedValue);
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Value saved successfully')),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error saving value: $e')),
      );
    }
  }

  Future<void> _retrieveValue() async {
    final key = _keyController.text;

    if (key.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Key cannot be empty')),
      );
      return;
    }

    try {
      final value = await NativeSecuredStorage.retrieve(key);
      setState(() {
        _retrievedValue = value?.toString();
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Value retrieved successfully')),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error retrieving value: $e')),
      );
    }
  }

  Future<void> _deleteValue() async {
    final key = _keyController.text;

    if (key.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Key cannot be empty')),
      );
      return;
    }

    try {
      await NativeSecuredStorage.delete(key);
      setState(() {
        _retrievedValue = null;
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Value deleted successfully')),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error deleting value: $e')),
      );
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Secure Storage Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              controller: _keyController,
              decoration: InputDecoration(labelText: 'Key'),
            ),
            TextField(
              controller: _valueController,
              decoration: InputDecoration(labelText: 'Value'),
            ),
            SizedBox(height: 16),
            Row(
              children: [
                ElevatedButton(
                  onPressed: _saveValue,
                  child: Text('Save'),
                ),
                SizedBox(width: 8),
                ElevatedButton(
                  onPressed: _retrieveValue,
                  child: Text('Retrieve'),
                ),
                SizedBox(width: 8),
                ElevatedButton(
                  onPressed: _deleteValue,
                  child: Text('Delete'),
                ),
              ],
            ),
            SizedBox(height: 16),
            if (_retrievedValue != null)
              Text('Retrieved Value: $_retrievedValue'),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter安全存储插件native_secured_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全存储插件native_secured_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用native_secured_storage插件来安全存储数据的示例代码。native_secured_storage插件允许你在iOS和Android平台上安全地存储敏感数据,比如密码、密钥等。

首先,确保你已经在pubspec.yaml文件中添加了native_secured_storage依赖:

dependencies:
  flutter:
    sdk: flutter
  native_secured_storage: ^2.0.0 # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用native_secured_storage插件:

  1. 导入插件

    在你需要使用存储功能的Dart文件中导入插件:

    import 'package:native_secured_storage/native_secured_storage.dart';
    
  2. 初始化插件

    通常在应用启动时初始化插件。你可以在main.dart中或者一个更合适的初始化位置进行:

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await NativeSecuredStorage.initialize();
      runApp(MyApp());
    }
    
  3. 存储数据

    使用NativeSecuredStorage.write方法来存储数据。你可以指定一个key和value,以及是否加密存储(默认为加密):

    void storeData() async {
      String key = "my_secure_key";
      String value = "my_secure_value";
      bool encrypt = true; // 默认为true,表示加密存储
    
      try {
        await NativeSecuredStorage.write(
          key: key,
          value: value,
          encrypted: encrypt
        );
        print("Data stored successfully");
      } catch (e) {
        print("Error storing data: $e");
      }
    }
    
  4. 读取数据

    使用NativeSecuredStorage.read方法来读取数据。你需要提供之前存储时使用的key:

    void readData() async {
      String key = "my_secure_key";
    
      try {
        String? value = await NativeSecuredStorage.read(key: key);
        if (value != null) {
          print("Retrieved value: $value");
        } else {
          print("No value found for key: $key");
        }
      } catch (e) {
        print("Error reading data: $e");
      }
    }
    
  5. 删除数据

    使用NativeSecuredStorage.delete方法来删除存储的数据:

    void deleteData() async {
      String key = "my_secure_key";
    
      try {
        await NativeSecuredStorage.delete(key: key);
        print("Data deleted successfully");
      } catch (e) {
        print("Error deleting data: $e");
      }
    }
    
  6. 检查是否包含数据

    使用NativeSecuredStorage.contains方法来检查是否存储了某个key的数据:

    void checkIfDataExists() async {
      String key = "my_secure_key";
    
      try {
        bool exists = await NativeSecuredStorage.contains(key: key);
        if (exists) {
          print("Data exists for key: $key");
        } else {
          print("No data exists for key: $key");
        }
      } catch (e) {
        print("Error checking data: $e");
      }
    }
    

这是一个完整的示例,展示了如何在Flutter应用中使用native_secured_storage插件来安全地存储和读取数据。根据你的需求,你可以将这些方法集成到你的业务逻辑中。

回到顶部