Flutter安全加密插件aes_crypt_null_safe的使用
Flutter安全加密插件aes_crypt_null_safe
的使用
简介
aes_crypt_null_safe
是一个用于Dart和Flutter开发者的库,它使用256位AES算法来加密/解密文件、纯文本和二进制数据。该库完全兼容AES Crypt文件格式,并且可以在任何平台上使用,因为所有算法都是用纯Dart实现的。
特性
- 支持256位AES加密格式。
- 支持文件到文件的加密和解密。
- 支持内存到文件的加密以及文件到内存的解密。
- 密码支持Unicode字符(如"密码 パスワード пароль كلمة السر")。
- 支持异步文件系统读写操作。
- 加密后的文件具有
.aes
扩展名,其他操作系统上的客户端可以识别。 - 提供适用于Windows、Linux、Mac OS、Android和iOS的兼容软件。
使用方法
1. 添加依赖
首先,在您的pubspec.yaml
文件中添加依赖:
dependencies:
aes_crypt_null_safe: ^1.0.0
然后运行 flutter pub get
来安装依赖。
2. 初始化
在您的Dart代码中添加以下导入:
import 'dart:typed_data';
import 'package:aes_crypt_null_safe/aes_crypt_null_safe.dart';
设置密码
// 直接初始化并设置密码
var crypt = AesCrypt('my cool password');
// 或者分步设置
var crypt = AesCrypt();
crypt.setPassword('my cool password');
设置覆盖模式
// 覆盖已存在的文件
crypt.setOverwriteMode(AesCryptOwMode.on);
// 如果文件存在,则抛出异常
crypt.setOverwriteMode(AesCryptOwMode.warn);
// 如果文件存在,则重命名新文件(例如:添加(1), (2)等)
crypt.setOverwriteMode(AesCryptOwMode.rename);
3. 文件加密/解密示例
// 加密文件srcfile.txt并保存为srcfile.txt.aes
crypt.encryptFileSync('srcfile.txt');
// 加密文件srcfile.txt并保存为enc_file.txt.aes
crypt.encryptFileSync('srcfile.txt', 'enc_file.txt.aes');
// 解密文件srcfile.txt.aes并保存为srcfile.txt
crypt.decryptFileSync('srcfile.txt.aes');
// 解密文件srcfile.txt.aes并保存为dec_file.txt
crypt.decryptFileSync('srcfile.txt.aes', 'dec_file.txt');
4. 文本加密/解密示例
String decryptedText;
// 要加密的纯文本
String srcText = 'some text';
// 将UTF8编码的文本加密并保存为mytext.txt.aes
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes');
// 将UTF16 Big Endian编码的文本加密并保存为mytext.txt.aes
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes', utf16: true);
// 将UTF16 Little Endian编码的文本加密并保存为mytext.txt.aes
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes', utf16: true, endian: Endian.little);
// 解密文件并根据BOM自动选择编码
decryptedText = crypt.decryptTextFromFileSync('mytext.txt.aes');
// 强制以UTF16 Big Endian编码解密
decryptedText = crypt.decryptTextFromFileSync('mytext.txt.aes', utf16: true);
5. 二进制数据加密/解密示例
// 要加密的二进制数据
Uint8List srcData = Uint8List.fromList([1,2,3,4,5]);
// 加密数据并保存为mydata.bin.aes
crypt.encryptDataToFileSync(srcData, 'mydata.bin.aes');
// 解密数据
Uint8List decryptedData = crypt.decryptDataFromFileSync('mydata.bin.aes');
6. AES模式加密/解密示例
// 设置密钥和IV
Uint8List key = Uint8List.fromList([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
Uint8List iv = Uint8List.fromList([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
AesMode mode = AesMode.cbc;
// 设置密钥、IV和模式
crypt.aesSetKeys(key, iv);
crypt.aesSetMode(mode);
// 加密数据
Uint8List encryptedData = crypt.aesEncrypt(srcData);
// 解密数据
Uint8List decryptedData = crypt.aesDecrypt(encryptedData);
7. SHA256和HMAC-SHA256计算
// 源数据
Uint8List srcData = Uint8List.fromList([1,2,3,4,5,6,7,8,9]);
// 计算SHA256哈希值
Uint8List hash = crypt.sha256(srcData);
// HMAC密钥
Uint8List key = Uint8List.fromList([1,2,3]);
// 计算HMAC-SHA256
Uint8List hmac = crypt.hmacSha256(key, srcData);
以上就是aes_crypt_null_safe
的基本使用方法。通过这个插件,您可以轻松地在Flutter应用中实现文件、文本和二进制数据的安全加密和解密功能。
更多关于Flutter安全加密插件aes_crypt_null_safe的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter安全加密插件aes_crypt_null_safe的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用aes_crypt_null_safe
插件进行AES加密和解密的示例代码。
首先,你需要在你的pubspec.yaml
文件中添加依赖项:
dependencies:
flutter:
sdk: flutter
aes_crypt_null_safe: ^1.0.0 # 请注意版本号,使用最新的稳定版本
然后运行flutter pub get
来安装依赖。
以下是一个完整的示例,展示了如何使用aes_crypt_null_safe
进行加密和解密:
import 'package:flutter/material.dart';
import 'package:aes_crypt_null_safe/aes_crypt_null_safe.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('AES Encryption Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: MyHomePage(),
),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final TextEditingController _plainTextController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
String? _encryptedText;
String? _decryptedText;
void _encrypt() {
final plainText = _plainTextController.text;
final password = _passwordController.text;
if (plainText.isEmpty || password.isEmpty) {
return;
}
final key = AesCrypt.generateKeyFromPassword(password!, length: 32);
final aes = AesCrypt(key);
final encrypted = aes.encrypt(plainText);
setState(() {
_encryptedText = encrypted;
_decryptedText = null;
});
}
void _decrypt() {
final encryptedText = _encryptedText ?? '';
final password = _passwordController.text;
if (encryptedText.isEmpty || password.isEmpty) {
return;
}
final key = AesCrypt.generateKeyFromPassword(password!, length: 32);
final aes = AesCrypt(key);
final decrypted = aes.decrypt(encryptedText);
setState(() {
_decryptedText = decrypted;
});
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: _plainTextController,
decoration: InputDecoration(labelText: 'Plain Text'),
maxLines: 4,
),
SizedBox(height: 16),
TextField(
controller: _passwordController,
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
),
SizedBox(height: 16),
ElevatedButton(
onPressed: _encrypt,
child: Text('Encrypt'),
),
SizedBox(height: 16),
if (_encryptedText != null)
Text(
'Encrypted Text: $_encryptedText',
style: TextStyle(color: Colors.blue),
),
SizedBox(height: 16),
if (_decryptedText != null)
Text(
'Decrypted Text: $_decryptedText',
style: TextStyle(color: Colors.green),
),
SizedBox(height: 16),
if (_encryptedText != null)
ElevatedButton(
onPressed: _decrypt,
child: Text('Decrypt'),
),
],
);
}
}
// Helper function to make Column a widget that can be used directly in Scaffold's body
Widget Column({required List<Widget> children, CrossAxisAlignment? crossAxisAlignment}) {
return Center(
child: Container(
constraints: BoxConstraints(maxWidth: 600),
child: Column(
crossAxisAlignment: crossAxisAlignment ?? CrossAxisAlignment.center,
children: children,
),
),
);
}
在这个示例中,我们创建了一个简单的Flutter应用,它包含两个TextField
用于输入明文和密码,以及两个ElevatedButton
用于触发加密和解密操作。加密后的文本和解密后的文本分别显示在页面上。
注意事项
- 密码安全:在实际应用中,密码存储和传输需要非常小心,不应以明文形式出现在客户端代码中。
- 密钥管理:生成和使用密钥应遵守最佳安全实践。
- 错误处理:在实际应用中,应该添加错误处理逻辑,例如捕获和显示加密/解密过程中可能出现的异常。
希望这个示例对你有帮助!