flutter如何加密shared_preferences数据

在Flutter中使用shared_preferences存储数据时,如何对数据进行加密?我想存储一些敏感信息,但担心直接使用shared_preferences会被轻易读取。是否有推荐的加密方案或插件可以直接集成?最好能提供具体的代码示例或实现思路。

2 回复

使用 flutter_secure_storage 替代 shared_preferences,它利用平台原生密钥库(Android KeyStore / iOS Keychain)自动加密数据。安装后,通过 writeread 方法安全存储敏感信息。

更多关于flutter如何加密shared_preferences数据的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,shared_preferences 默认以明文存储数据,安全性较低。要加密数据,可以使用 flutter_secure_storage 包(基于 Keychain 和 Keystore)或对 shared_preferences 的数据进行手动加密。以下是两种方法:

1. 使用 flutter_secure_storage(推荐)

直接存储加密数据,适用于敏感信息(如令牌、密码):

# pubspec.yaml 添加依赖
dependencies:
  flutter_secure_storage: ^9.0.0
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

final storage = FlutterSecureStorage();

// 写入加密数据
await storage.write(key: 'token', value: 'your_sensitive_data');

// 读取数据
String? value = await storage.read(key: 'token');

2. 手动加密 shared_preferences 数据

结合加密库(如 encrypt)对数据进行加密后存储:

dependencies:
  shared_preferences: ^2.2.2
  encrypt: ^5.0.1
import 'package:shared_preferences/shared_preferences.dart';
import 'package:encrypt/encrypt.dart';

// 加密密钥(务必安全存储,避免硬编码)
final key = Key.fromLength(32); // AES-256
final iv = IV.fromLength(16);
final encrypter = Encrypter(AES(key));

String encryptData(String plainText) {
  return encrypter.encrypt(plainText, iv: iv).base64;
}

String decryptData(String encryptedText) {
  return encrypter.decrypt64(encryptedText, iv: iv);
}

// 存储加密数据
Future<void> saveEncryptedData(String key, String value) async {
  final prefs = await SharedPreferences.getInstance();
  String encryptedValue = encryptData(value);
  await prefs.setString(key, encryptedValue);
}

// 读取并解密数据
Future<String?> getDecryptedData(String key) async {
  final prefs = await SharedPreferences.getInstance();
  String? encryptedValue = prefs.getString(key);
  return encryptedValue != null ? decryptData(encryptedValue) : null;
}

// 使用示例
await saveEncryptedData('user_email', 'example@email.com');
String? email = await getDecryptedData('user_email');

注意事项:

  • 密钥管理:避免在代码中硬加密密钥,可通过后端获取或使用设备生物特征绑定。
  • 性能:加解密操作会轻微影响性能,仅建议用于敏感数据。
  • flutter_secure_storage 在 iOS 和 Android 上利用系统安全机制,无需手动处理密钥。

根据需求选择方案:flutter_secure_storage 更便捷安全,手动加密适合已有 shared_preferences 的改造场景。

回到顶部