Flutter安全存储插件native_secured_storage的使用
以下是关于“Flutter安全存储插件native_secured_storage的使用”的详细内容:
Flutter安全存储插件native_secured_storage的使用
native_secured_storage
是一个为 Flutter 设计的安全存储插件,用于使用 Android Keystore 和 iOS Keychain 安全地存储和检索原始数据类型(int
、double
、bool
和 String
)。这确保了数据在静止时被加密,并且即使设备被破解也能防止未经授权的访问。
为什么使用 native_secured_storage
?
安全特性
-
Android Keystore 使用 EncryptedSharedPreferences
- 使用 AES256 加密,并将唯一密钥安全地存储在 Android Keystore 中。
- 确保加密和解密仅在设备上进行。
-
iOS Keychain
- 直接集成到 Apple 的 Keychain 中,为敏感数据提供系统级安全性。
- 如果可用,使用设备的 Secure Enclave 保护数据。
-
不存储明文
- 所有数据在保存之前都会被加密,确保敏感信息永远不会以明文形式存储。
-
平台隔离
- Android 和 iOS 分别实现确保数据在每个平台的原生环境中安全存储。
使用场景
- 认证: 安全地存储令牌、密码或敏感用户凭据。
- 偏好设置: 保存加密的应用程序偏好设置,如用户设置或功能标志。
- 安全标识符: 存储应用程序逻辑所需的唯一标识符或密钥。
特性
- 跨平台: 支持 Android 和 iOS。
- 类型支持: 安全处理
int
、double
、bool
和String
类型。 - 易于使用的 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
更多关于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
插件:
-
导入插件:
在你需要使用存储功能的Dart文件中导入插件:
import 'package:native_secured_storage/native_secured_storage.dart';
-
初始化插件:
通常在应用启动时初始化插件。你可以在
main.dart
中或者一个更合适的初始化位置进行:void main() async { WidgetsFlutterBinding.ensureInitialized(); await NativeSecuredStorage.initialize(); runApp(MyApp()); }
-
存储数据:
使用
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"); } }
-
读取数据:
使用
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"); } }
-
删除数据:
使用
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"); } }
-
检查是否包含数据:
使用
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
插件来安全地存储和读取数据。根据你的需求,你可以将这些方法集成到你的业务逻辑中。