Flutter加密解密插件cryptology的使用
Flutter 加密解密插件 cryptology 的使用
Cryptology
是一个用于在 Dart 和 Flutter 中使用 Pointycastle 库进行密码学操作的库。该库提供了密码加密和数据加密功能。
开始使用
要在项目中使用 cryptology
插件,请将其添加到 pubspec.yaml
文件中:
flutter pub add cryptology
密码加密与验证
PasswordEncryption
使用 PBKDF2 算法对密码进行哈希处理。
PBKDF2 如何工作?
PBKDF2 接收输入参数包括密码、盐值、定义要执行的散列函数迭代次数的整数,以及描述输出所需密钥长度的整数。
初始化 PasswordEncryption
要初始化 PasswordEncryption
对象:
final passwordEncryption = PasswordEncryption.initial(difficulty: HashDifficulty.strong);
哈希密码
然后可以对密码进行哈希处理:
final hashedPwd = passwordEncryption.hash("pa$$w0rd"); // 哈希密码
// 如果你需要 Base64 编码的密码,可以使用 hashB64 方法。
final b64StringHashedPwd = passwordEncryption.hashB64("pa$$w0rd");
验证哈希密码
要验证哈希后的密码:
final isValid = passwordEncryption.verify("pa$$w0rd", hashedPwd); // 验证密码
// 如果你有 Base64 编码的密码,可以使用 verifyB64 方法。
final isValidB64 = passwordEncryption.verifyB64("pa$$w0rd", b64StringHashedPwd);
数据加密
DataEncryption
使用 AES 算法对数据进行加密。
AES 如何工作?
高级加密标准(AES)通过将明文或二进制数据转换为看似随机字符组成的密文来工作。只有拥有特殊密钥的人才能解密它。AES 使用对称密钥加密,即只使用一个秘密密钥来加密和解密信息。
初始化 DataEncryption
要初始化 DataEncryption
对象:
final DataEncryption dataEncryption = DataEncryption.initial(
secretKey: '1a2b3c4d', mode: AESMode.cbc, iv: 'q1w2e3r4');
- 提供至少 8 个字符但最多 32 个字符的秘密密钥。
- 提供模式,如
cbc
,cfb
,ofb
,gcm
。 - 提供初始向量(IV),至少 8 个字符但最多 16 个字符(如果未提供 IV,则使用密钥的反转作为 IV)。
加密数据
要加密数据,需要将数据转换为字节数组。
对于纯文本数据:
final plainText = "plain text data";
final Uint8List dataAsBytes = CryptoHelpers.toBytes(plainText);
// 或者使用扩展方法:
final Uint8List dataAsBytes = plainText.toBytes();
对于文件数据:
final fileData = await File("~/Pictures/my_profile.png").readAsBytes();
加密字节数组
final encryptedData = await dataEncryption.encrypt(fileData); // 加密数据
// 对于 Base64 字符串编码:
final encryptedData = await dataEncryption.encryptB64(fileData);
解密数据
要解密加密的数据,可以使用以下方法:
final decryptedData = await dataEncryption.decrypt(encryptedData); // 解密数据
// 如果你的加密数据是 Base64 编码的,可以使用 decryptB64 方法:
final decryptedData = await dataEncryption.decryptB64(encryptedData);
更多关于Flutter加密解密插件cryptology的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter加密解密插件cryptology的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用cryptology
插件进行加密和解密的示例代码。cryptology
插件提供了对多种加密算法的支持,这里我们以AES加密为例。
首先,你需要在你的pubspec.yaml
文件中添加cryptology
依赖:
dependencies:
flutter:
sdk: flutter
cryptology: ^x.y.z # 请替换为最新的版本号
然后运行flutter pub get
来安装依赖。
接下来,是一个简单的Flutter应用示例,演示如何使用cryptology
进行AES加密和解密:
import 'package:flutter/material.dart';
import 'package:cryptology/cryptology.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Cryptology Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final TextEditingController _plainTextController = TextEditingController();
final TextEditingController _encryptedTextController = TextEditingController();
final TextEditingController _decryptedTextController = TextEditingController();
final TextEditingController _keyController = TextEditingController();
String? _encryptError;
String? _decryptError;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Cryptology Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _keyController,
decoration: InputDecoration(labelText: 'Encryption Key'),
),
SizedBox(height: 16),
TextField(
controller: _plainTextController,
decoration: InputDecoration(labelText: 'Plain Text'),
maxLines: 5,
),
SizedBox(height: 16),
ElevatedButton(
onPressed: _encrypt,
child: Text('Encrypt'),
),
SizedBox(height: 16),
TextField(
controller: _encryptedTextController,
decoration: InputDecoration(labelText: 'Encrypted Text'),
readOnly: true,
maxLines: 5,
),
SizedBox(height: 16),
ElevatedButton(
onPressed: _decrypt,
child: Text('Decrypt'),
),
SizedBox(height: 16),
TextField(
controller: _decryptedTextController,
decoration: InputDecoration(labelText: 'Decrypted Text'),
readOnly: true,
maxLines: 5,
),
SizedBox(height: 16),
if (_encryptError != null)
Text(
'Encrypt Error: $_encryptError',
style: TextStyle(color: Colors.red),
),
if (_decryptError != null)
Text(
'Decrypt Error: $_decryptError',
style: TextStyle(color: Colors.red),
),
],
),
),
);
}
Future<void> _encrypt() async {
setState(() {
_encryptedTextController.clear();
_encryptError = null;
});
final String? key = _keyController.text;
final String? plainText = _plainTextController.text;
if (key == null || plainText == null) {
setState(() {
_encryptError = 'Key and plain text are required.';
});
return;
}
try {
final aes = AesCbcWithPkcs7Padding();
final encrypted = await aes.encrypt(plainText, key: key);
_encryptedTextController.text = encrypted.base64;
} catch (e) {
setState(() {
_encryptError = e.toString();
});
}
}
Future<void> _decrypt() async {
setState(() {
_decryptedTextController.clear();
_decryptError = null;
});
final String? key = _keyController.text;
final String? encryptedTextBase64 = _encryptedTextController.text;
if (key == null || encryptedTextBase64 == null) {
setState(() {
_decryptError = 'Key and encrypted text are required.';
});
return;
}
try {
final aes = AesCbcWithPkcs7Padding();
final encrypted = Encrypted.fromBase64(encryptedTextBase64);
final decrypted = await aes.decrypt(encrypted, key: key);
_decryptedTextController.text = decrypted;
} catch (e) {
setState(() {
_decryptError = e.toString();
});
}
}
}
解释
- 依赖添加:在
pubspec.yaml
文件中添加cryptology
依赖。 - UI布局:使用
TextField
和ElevatedButton
构建了一个简单的UI,允许用户输入密钥、明文、查看加密后的文本以及解密后的文本。 - 加密函数:
_encrypt
函数使用AES-CBC-PKCS7填充模式进行加密。用户输入密钥和明文后,点击“Encrypt”按钮,加密后的文本将以Base64格式显示。 - 解密函数:
_decrypt
函数使用AES-CBC-PKCS7填充模式进行解密。用户输入密钥和加密后的Base64文本后,点击“Decrypt”按钮,解密后的明文将显示。
注意:AES加密需要一个密钥,密钥的长度和格式取决于具体的算法实现。在实际应用中,密钥管理非常重要,应该妥善保管。
希望这个示例代码对你有所帮助!