Flutter数据加密插件steel_crypt的使用
Flutter数据加密插件steel_crypt的使用
Steel Crypt 3.0 (BETA)
Steel Crypt 是一个提供高层次密码学API的库,这些API可以手动定义或从PointyCastle中提取。该库目前支持哈希、对称双向加密和密钥/IV生成。它还包含一个CLI,用于执行基本的密码学操作。
这个库是 PointyCastle 的高层次封装。曾经包含了一个PointyCastle的分支,但是自从该包归BouncyCastle组织所有后,分支中的添加内容已经被合并到上游。
Null Safety
此库已完全迁移到null safety。版本3.0.0在功能上与2.3.1+6相同,只是进行了这个迁移过程。由于一些参数从前是“可选”的命名参数,现在变成了必填项,接口可能会有轻微的变化。
注意:文档
当前文档尚未完全编写!Steel Crypt 3.X带来了重大变化,并将在GitHub Pages上有静态网站作为文档。目前,您可以查看API参考以获取更多关于beta版类的信息。每个类都有相当详细的文档。
注意:RSA弃用
考虑到pub.dev上的包过于饱和,这使得独立开发者难以做出选择。我担心会加剧这个问题。此外,我没有研究过非对称加密;我不觉得舒适地处理它,也不认为这个包在非对称加密方面为生态系统增添了太多价值。因此,我将不再维护Steel Crypt中的RSA功能。受影响的用户可以考虑使用crypton,这是一个更专注于非对称操作的包。
示例代码
以下是一个完整的示例demo,展示了如何使用Steel Crypt进行各种加密操作:
import 'package:steel_crypt/steel_crypt.dart';
void main() {
// 密钥/IV/Nonce生成
var keyGen = CryptKey();
var key32 = keyGen.genFortuna(len: 32); // 生成32字节的密钥
var key16 = keyGen.genFortuna(len: 16); // 生成16字节的密钥
var iv16 = keyGen.genDart(len: 16); // 生成AES的IV
var iv8 = keyGen.genDart(len: 8); // 生成ChaCha20的IV
// 创建加密器
var aes = AesCrypt(key: key32, padding: PaddingAES.pkcs7);
var stream = LightCrypt(key: key32, algo: StreamAlgo.chacha20_12);
var hasher = HashCrypt(algo: HashAlgo.Blake2b);
var mac = MacCrypt(key: key16, type: MacType.CMAC);
var passHash = PassCrypt.scrypt();
// 打印生成的密钥和IV
print('Keys:');
print('key32: $key32 \nkey16: $key16');
print('');
print('IVs:');
print('For AES/SCrypt: $iv16 \nFor ChaCha20: $iv8');
print('');
// SHA-3 512 哈希
print('SHA-3 512 Hash:');
var hash = hasher.hash(inp: 'example'); // 执行哈希
print(hash);
print(hasher.check(plain: 'example', hashed: hash)); // 验证哈希
print('');
// CMAC AES CBC 哈希
print('CMAC AES CBC Hash:');
var hash2 = mac.process(inp: 'words'); // 执行哈希
print(hash2);
print(mac.check(plain: 'words', hashed: hash2)); // 验证哈希
print('');
// scrypt 密码哈希
print('Password hash (scrypt):');
var hash3 = passHash.hash(salt: iv16, inp: 'words'); // 执行哈希
print(hash3);
print(passHash.check(
salt: iv16, plain: 'words', hashed: hash3)); // 验证哈希
print('');
// ChaCha20 对称加密
print('ChaCha20 Symmetric:');
var crypted3 = stream.encrypt(inp: 'broken', iv: iv8); // 加密
print(crypted3);
print(stream.decrypt(enc: crypted3, iv: iv8)); // 解密
print('');
// AES GCM 加密解密
print('AES Symmetric GCM:');
var crypted = aes.gcm.encrypt(inp: 'words', iv: iv16); // 加密
print(crypted);
print(aes.gcm.decrypt(enc: crypted, iv: iv16)); // 解密
print('');
// AES CTR 对称流加密
print('AES Symmetric CTR:');
var crypted2 = aes.ctr.encrypt(inp: 'words', iv: iv16); // 加密
print(crypted2);
print(aes.ctr.decrypt(enc: crypted2, iv: iv16)); // 解密
print('');
}
依赖配置
在pubspec.yaml
文件中添加依赖:
dependencies:
steel_crypt: ^3.0.0-beta
然后运行flutter pub get
来安装依赖。
通过以上步骤,您可以在Flutter项目中使用Steel Crypt进行各种加密操作。希望这些信息能帮助您更好地理解和使用Steel Crypt插件。如果有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter数据加密插件steel_crypt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据加密插件steel_crypt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用steel_crypt
插件进行数据加密和解密的示例代码。steel_crypt
是一个用于Flutter的加密库,支持多种加密算法。假设我们要使用AES加密和解密一个字符串。
首先,确保你已经在pubspec.yaml
文件中添加了steel_crypt
依赖:
dependencies:
flutter:
sdk: flutter
steel_crypt: ^latest_version # 请替换为实际最新版本号
然后运行flutter pub get
来获取依赖。
接下来,在你的Flutter项目中,你可以创建一个Dart文件(例如encryption_service.dart
)来处理加密和解密逻辑。
import 'package:flutter/material.dart';
import 'package:steel_crypt/steel_crypt.dart';
class EncryptionService {
// AES加密密钥(16, 24, 或 32字节长度)
final String key = '1234567890abcdef1234567890abcdef'; // 32字节示例
final SteelCrypt steelCrypt = SteelCrypt();
// AES加密方法
Future<String> encrypt(String plainText) async {
try {
final encryptedData = await steelCrypt.aesEncrypt(
plainText,
key: key,
iv: null, // 如果不指定IV,steel_crypt会生成一个随机的
);
return encryptedData;
} catch (e) {
print("Encryption error: $e");
return null;
}
}
// AES解密方法
Future<String> decrypt(String encryptedData) async {
try {
final decryptedData = await steelCrypt.aesDecrypt(
encryptedData,
key: key,
iv: null, // 确保解密时使用的IV与加密时相同,如果加密时没有指定,这里也应为null
);
return decryptedData;
} catch (e) {
print("Decryption error: $e");
return null;
}
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final EncryptionService _encryptionService = EncryptionService();
String _plainText = 'Hello, Flutter!';
String _encryptedText = '';
String _decryptedText = '';
@override
void initState() {
super.initState();
_encryptText();
}
Future<void> _encryptText() async {
String encrypted = await _encryptionService.encrypt(_plainText);
setState(() {
_encryptedText = encrypted;
_decryptText();
});
}
Future<void> _decryptText() async {
String decrypted = await _encryptionService.decrypt(_encryptedText);
setState(() {
_decryptedText = decrypted;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('AES Encryption/Decryption Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Plain Text: $_plainText'),
SizedBox(height: 16),
Text('Encrypted Text: $_encryptedText'),
SizedBox(height: 16),
Text('Decrypted Text: $_decryptedText'),
],
),
),
),
);
}
}
在这个示例中,我们创建了一个EncryptionService
类,该类包含AES加密和解密的方法。key
是用于AES加密的密钥,必须是16、24或32字节长度。iv
(初始化向量)在加密时如果未指定,steel_crypt
会生成一个随机的IV,并在返回的加密数据中包含它,因此解密时需要确保使用相同的IV。
在MyApp
中,我们初始化EncryptionService
实例,并在initState
方法中调用加密方法,然后调用解密方法以显示结果。
请注意,在实际应用中,密钥管理非常重要,不应硬编码在客户端代码中。此外,还要确保处理加密和解密过程中的错误情况。