Flutter加密共享偏好插件encrypt_shared_preferences的使用

Flutter加密共享偏好插件encrypt_shared_preferences的使用

Shared preferences 是一种简单的键值存储机制,可以用来存储少量的数据。然而,由于 shared preferences 是以明文形式存储的,因此不适合存储敏感信息。为了解决这个问题,可以在保存数据到 shared preferences 之前使用 AES 加密。

为了在您的 Flutter 项目中使用带有 AES 加密支持的 shared preferences,您可以将 encrypt_shared_preferences 包添加为依赖项。

您可以在 pub.dev 上查看该包

使用方法

初始化

首先需要初始化 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);
});

示例代码

下面是一个完整的示例应用程序,它展示了如何使用 EncryptedSharedPreferencesSharedBuilder 来创建一个简单的 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

1 回复

更多关于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'),
        ),
      ],
    );
  }
}

注意事项

  1. 安全性:确保你使用的密码足够复杂且安全,避免使用简单的密码或硬编码的密码。
  2. 依赖版本:在pubspec.yaml中,替换^x.y.z为实际的插件版本。
  3. 错误处理:在实际应用中,你可能需要添加更多的错误处理逻辑,例如捕获异常并通知用户。

这个示例展示了如何使用encrypt_shared_preferences插件来加密和解密存储在共享偏好中的数据。你可以根据需要进一步扩展和定制这个示例。

回到顶部