Flutter加密解密插件fernet的使用
Flutter 加密解密插件 fernet 的使用
fernet
一个用于使用 Fernet 方案对消息进行加密和解密的 Dart 库。
这是 Python cryptography 库中 Fernet 实现的直接移植版本。
要求
- Dart SDK: 3.4+
使用密码与 Fernet
可以使用密码与 Fernet 结合。为此,需要通过 PBKDF2HMAC、bcrypt、scrypt 或 argon2 等密钥派生函数处理密码。示例见 example/password.dart。
实现
Fernet 基于一系列标准的加密原语构建。具体而言,它使用:
- AES 在 CBC 模式下使用 128 位密钥进行加密;使用 PKCS7 填充。
- 使用 SHA256 进行 HMAC 认证。
- 初始化向量通过
Random.secure()
生成。
有关详细信息,请参阅 specification。
此库中使用的加密原语由 pointycastle 提供。
限制
Fernet 适用于容易放入内存的数据加密。作为设计特性,它不暴露未认证的字节。这意味着完整的消息内容必须在内存中可用,这使得 Fernet 目前不适合非常大的文件。
致谢
本库使用了其他开源项目的代码。这些开源项目的版权声明列在 CREDITS.md 中。大多数文档和实现细节都是从 Python cryptography 库中改编而来的。
完整示例 Demo
import 'dart:convert';
import 'dart:typed_data';
import 'package:fernet/fernet.dart';
void main() {
// 生成一个随机的密钥
final Fernet f = Fernet(Fernet.generateKey());
// 待加密的消息
final String message = 'A really secret message. Not for prying eyes.';
// 将消息转换为 Uint8List 类型
final Uint8List plainText = Uint8List.fromList(utf8.encode(message));
// 加密消息
final Uint8List token = f.encrypt(plainText);
// 解密消息
final Uint8List decryptedText = f.decrypt(token);
// 将解密后的 Uint8List 转换为字符串并打印
print(utf8.decode(decryptedText));
// 输出: 'A really secret message. Not for prying eyes.'
}
代码解释
-
导入必要的库
import 'dart:convert'; import 'dart:typed_data'; import 'package:fernet/fernet.dart';
-
生成一个随机的密钥
final Fernet f = Fernet(Fernet.generateKey());
-
定义待加密的消息
final String message = 'A really secret message. Not for prying eyes.';
-
将消息转换为
Uint8List
类型final Uint8List plainText = Uint8List.fromList(utf8.encode(message));
-
加密消息
final Uint8List token = f.encrypt(plainText);
-
解密消息
final Uint8List decryptedText = f.decrypt(token);
-
将解密后的
Uint8List
转换为字符串并打印print(utf8.decode(decryptedText));
输出:
A really secret message. Not for prying eyes.
更多关于Flutter加密解密插件fernet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter加密解密插件fernet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用Fernet加密解密插件的一个基本示例。Fernet是一种基于密码学的消息加密协议,通常用于确保消息的机密性、完整性和来源验证。
首先,确保你已经在Flutter项目中添加了Fernet相关的依赖。你可以在pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
fernet_dart: ^x.y.z # 请将x.y.z替换为最新的版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中使用Fernet进行加密和解密操作。以下是一个简单的示例代码:
import 'package:flutter/material.dart';
import 'package:fernet_dart/fernet_dart.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Fernet Encryption/Decryption Example'),
),
body: Center(
child: FernetExample(),
),
),
);
}
}
class FernetExample extends StatefulWidget {
@override
_FernetExampleState createState() => _FernetExampleState();
}
class _FernetExampleState extends State<FernetExample> {
String? encryptedMessage;
String? decryptedMessage;
String keyBase64 = "your-32-byte-key-encoded-in-base64"; // 替换为你的32字节密钥的Base64编码
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'Plain Text Message'),
onChanged: (value) {
// 可以在这里添加逻辑来动态加密或解密文本
},
),
ElevatedButton(
onPressed: () async {
try {
// 生成密钥
Uint8List key = Uint8List.fromList(
base64Decode(keyBase64)!,
);
// 创建Fernet实例
Fernet fernet = Fernet(key);
// 获取输入框中的文本
final TextEditingController controller = TextEditingController();
// 这里应该使用TextField的controller来获取实际输入的值,为了简单起见,这里直接赋值
String plainTextMessage = "Hello, this is a secret message!";
// 加密
String encrypted = fernet.encrypt(plainTextMessage).toString();
setState(() {
encryptedMessage = encrypted;
});
// 解密
String decrypted = fernet.decrypt(Uint8List.fromList(base64Decode(encrypted)!)).toString();
setState(() {
decryptedMessage = decrypted;
});
} catch (e) {
print("Error: $e");
}
},
child: Text('Encrypt/Decrypt'),
),
if (encryptedMessage != null)
Text('Encrypted Message: $encryptedMessage'),
if (decryptedMessage != null)
Text('Decrypted Message: $decryptedMessage'),
],
);
}
}
注意:
- 上述代码是一个简单的演示,实际使用时你应该从UI的
TextField
中获取用户输入的文本,而不是硬编码的字符串。 - 你需要确保你的密钥是32字节长,并且正确地进行了Base64编码。
fernet_dart
插件的具体API可能会随着版本更新而变化,请参考最新的文档以获取准确的使用方式。- 错误处理在实际应用中非常重要,上述代码中的错误处理只是简单地打印了错误信息,你应该根据实际需求进行更详细的错误处理。
这个示例展示了如何使用Fernet在Flutter应用中进行基本的加密和解密操作。希望这对你有所帮助!