Flutter加密共享偏好插件encrypt_shared_preferences的使用
Flutter加密共享偏好插件encrypt_shared_preferences的使用
Shared preferences 是一种简单的键值存储机制,可以用来存储少量的数据。然而,由于 shared preferences 是以明文形式存储的,因此不适合存储敏感信息。为了解决这个问题,可以在保存数据到 shared preferences 之前使用 AES 加密。
为了在您的 Flutter 项目中使用带有 AES 加密支持的 shared preferences,您可以将 encrypt_shared_preferences
包添加为依赖项。
使用方法
初始化
首先需要初始化 EncryptedSharedPreferences,并提供一个用于加密和解密的密钥:
void main() async {
final key = "your_encryption_key"; // 注意:这里应该是32字节长度的字符串,即256位AES密钥
await EncryptedSharedPreferences.initialize(key: key);
var sharedPref = EncryptedSharedPreferences.getInstance();
}
存储与获取数据
接下来可以使用类似的方法来设置和获取数据,如字符串、整数、浮点数、布尔值和字符串列表等类型的数据:
// 设置和获取字符串
await sharedPref.setString('user_token', 'xxxxxxxxxxxx');
sharedPref.getString('user_token'); // 返回 'xxxxxxxxxxxx'
// 设置和获取整数
await sharedPref.setInt('age', 99);
sharedPref.getInt('age', defaultValue: 1001); // 返回 99
// 设置和获取浮点数
await sharedPref.setDouble('pi', 3.14);
sharedPref.getDouble('pi'); // 返回 3.14
// 设置和获取布尔值
await sharedPref.setBool('isPremium', true);
sharedPref.getBool('isPremium'); // 返回 true
// 设置和获取字符串列表
await sharedPref.setStringList("stringList", ["apple", "orange", "boom"]);
sharedPref.getStringList("stringList"); // 返回 ["apple", "orange", "boom"]
删除数据
可以删除特定的键值对或者清除所有数据:
await sharedPref.remove('user_token'); // 删除单个键值对
await sharedPref.clear(); // 清除所有数据
监听数据变化
还可以监听某些键的变化事件:
sharedPref.observe(key: 'token').listen((event) {
print(event); // 打印改变的键
});
sharedPref.observeSet(keys: {'key1', 'key2'}).listen((event) {
print(event); // 打印改变的键
});
自定义加密器
如果想要实现自己的加密逻辑,可以通过继承 IEncryptor
接口来自定义加密器:
class CustomEncryptor extends IEncryptor {
@override
String decrypt(String key, String encryptedData) {
// 实现解密逻辑
}
@override
String encrypt(String key, String plainText) {
// 实现加密逻辑
}
}
// 使用自定义加密器初始化
await EncryptedSharedPreferences.initialize(key: key, encryptor: CustomEncryptor());
批量操作(实验性)
对于批量插入或更新操作,可以使用 batch 方法:
await EncryptedSharedPreferences.getInstance().batch((batch) async {
await batch.setString('dataKey1', 'dataValue1');
await batch.setString('dataKey2', 'dataValue2');
await batch.setString('dataKey3', 'dataValue3');
return Future(() => true);
});
示例代码
下面是一个完整的示例应用程序,它展示了如何使用 EncryptedSharedPreferences
和 SharedBuilder
来创建一个简单的 UI 应用程序,该应用程序会在用户点击按钮时更新并显示存储在加密的 shared preferences 中的值。
import 'package:encrypt_shared_preferences/provider.dart';
import 'package:flutter/material.dart';
class CustomEncryptorAlgorithm implements IEncryptor {
@override
String decrypt(String key, String encryptedData) {
// 实现解密逻辑
const decryptedData = "";
return decryptedData;
}
@override
String encrypt(String key, String plainText) {
// 实现加密逻辑
const encryptedTextBase64 = "";
return encryptedTextBase64;
}
}
void main() async {
// 初始化 EncryptedSharedPreferences 并指定加密密钥及自定义加密器
final key = "your_encryption_key"; // 这里应该是32字节长度的字符串,即256位AES密钥
await EncryptedSharedPreferences.initialize(key: key, encryptor: CustomEncryptorAlgorithm());
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Shared Builder Demo'),
),
body: SharedBuilder(
listenKeys: const {"key1", "key2"}, // 可选参数
builder: (EncryptedSharedPreferences encryptedSharedPreferences, String? updatedKey) {
return Center(
child: Text(
"value : ${encryptedSharedPreferences.getString("key1") ?? "No value"}",
style: Theme.of(context).textTheme.headlineMedium,
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
// 更新 key1 的值
await EncryptedSharedPreferences.getInstance().setString('key1', DateTime.now().toString());
// 延迟三秒后更新 key2 的值
Future.delayed(const Duration(seconds: 3), () async {
await EncryptedSharedPreferences.getInstance().setString('key2', DateTime.now().toString());
});
},
child: const Icon(Icons.update),
),
),
);
}
}
请注意,在实际应用中,应该根据具体需求选择合适的加密方式,并确保安全地管理加密密钥。
更多关于Flutter加密共享偏好插件encrypt_shared_preferences的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter加密共享偏好插件encrypt_shared_preferences的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用encrypt_shared_preferences
插件来加密和解密共享偏好的代码示例。
首先,确保你已经将encrypt_shared_preferences
插件添加到了你的pubspec.yaml
文件中:
dependencies:
flutter:
sdk: flutter
encrypt_shared_preferences: ^x.y.z # 替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你需要初始化加密的共享偏好,并在你的应用中使用它。以下是一个完整的示例:
main.dart
import 'package:flutter/material.dart';
import 'package:encrypt_shared_preferences/encrypt_shared_preferences.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化加密的共享偏好
final encryptSharedPreferences = await EncryptSharedPreferences.getInstance(
// 你可以在这里设置密钥和加密算法参数,例如盐值等
password: 'your-encryption-password', // 替换为你的加密密码
);
runApp(MyApp(encryptSharedPreferences));
}
class MyApp extends StatelessWidget {
final EncryptSharedPreferences encryptSharedPreferences;
MyApp(this.encryptSharedPreferences);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Encrypt Shared Preferences Example'),
),
body: Center(
child: MyHomePage(encryptSharedPreferences),
),
),
);
}
}
class MyHomePage extends StatefulWidget {
final EncryptSharedPreferences encryptSharedPreferences;
MyHomePage(this.encryptSharedPreferences);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _keyController = TextEditingController();
final _valueController = TextEditingController();
void _saveToPreferences() async {
final key = _keyController.text;
final value = _valueController.text;
await widget.encryptSharedPreferences.setString(key, value);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Value saved to encrypted preferences')),
);
}
void _readFromPreferences() async {
final key = _keyController.text;
final value = await widget.encryptSharedPreferences.getString(key);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Value: $value')),
);
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextField(
controller: _keyController,
decoration: InputDecoration(labelText: 'Key'),
),
TextField(
controller: _valueController,
decoration: InputDecoration(labelText: 'Value'),
),
ElevatedButton(
onPressed: _saveToPreferences,
child: Text('Save to Preferences'),
),
ElevatedButton(
onPressed: _readFromPreferences,
child: Text('Read from Preferences'),
),
],
);
}
}
注意事项
- 安全性:确保你使用的密码足够复杂且安全,避免使用简单的密码或硬编码的密码。
- 依赖版本:在
pubspec.yaml
中,替换^x.y.z
为实际的插件版本。 - 错误处理:在实际应用中,你可能需要添加更多的错误处理逻辑,例如捕获异常并通知用户。
这个示例展示了如何使用encrypt_shared_preferences
插件来加密和解密存储在共享偏好中的数据。你可以根据需要进一步扩展和定制这个示例。