Flutter加密解密插件cryptography_plus的使用
Flutter加密解密插件cryptography_plus的使用
概览
cryptography_plus
是一个为Dart/Flutter开发者提供的流行密码学算法包。它由gohilla.com维护,后因缺乏维护而迁移至emz-hanauer/dart-cryptography。该包在Apache License 2.0下授权。
开始使用
如果你使用Flutter,建议(但不是必须)同时导入我们的姊妹包cryptography_flutter_plus,它会在可能的情况下委托调用给Android、iOS或Mac OS X的操作系统API。
在pubspec.yaml
中添加依赖:
dependencies:
cryptography_plus: ^2.7.0
cryptography_flutter_plus: ^2.3.2 # 如果你不使用Flutter可以移除这一行
示例代码
数字签名示例
以下是使用Ed25519进行数字签名和验证的示例:
import 'package:cryptography_plus/cryptography_plus.dart';
Future<void> main() async {
// 要签名的消息
final message = <int>[1, 2, 3];
// 生成密钥对
final algorithm = Ed25519();
final keyPair = await algorithm.newKeyPair();
// 签名
final signature = await algorithm.sign(
message,
keyPair: keyPair,
);
print('Signature: ${signature.bytes}');
print('Public key: ${signature.publicKey.bytes}');
// 验证签名
final isSignatureCorrect = await algorithm.verify(
message,
signature: signature,
);
print('Correct signature: $isSignatureCorrect');
}
密钥协商示例
以下是一个使用X25519进行密钥协商的示例:
import 'package:cryptography_plus/cryptography_plus.dart';
Future<void> main() async {
final algorithm = X25519();
// Alice选择她的密钥对
final aliceKeyPair = await algorithm.newKeyPair();
// Alice知道Bob的公钥
final bobKeyPair = await algorithm.newKeyPair();
final bobPublicKey = await bobKeyPair.extractPublicKey();
// Alice计算共享的秘密
final sharedSecret = await algorithm.sharedSecretKey(
keyPair: aliceKeyPair,
remotePublicKey: bobPublicKey,
);
final sharedSecretBytes = await sharedSecret.extractBytes();
print('Shared secret: $sharedSecretBytes');
}
认证加密示例
以下是一个使用AesGcm进行认证加密和解密的示例:
import 'dart:convert';
import 'package:cryptography_plus/cryptography_plus.dart';
Future<void> main() async {
// 选择加密算法
final algorithm = AesGcm.with256bits();
// 生成随机密钥
final secretKey = await algorithm.newSecretKey();
final secretKeyBytes = await secretKey.extractBytes();
print('Secret key: ${secretKeyBytes}');
// 加密
final secretBox = await algorithm.encryptString(
'Hello!',
secretKey: secretKey,
);
print('Nonce: ${secretBox.nonce}'); // 自动生成的随机nonce
print('Ciphertext: ${secretBox.cipherText}'); // 加密后的消息
print('MAC: ${secretBox.mac}'); // 消息认证码
// 如果你要发送secretBox,可以将所有部分连接起来:
final concatenatedBytes = secretBox.concatenation();
print('All three parts concatenated: $concatenatedBytes');
// 解密
final clearText = await algorithm.decryptString(
secretBox,
secretKey: secretKey,
);
print('Cleartext: $clearText'); // Hello!
}
密码哈希示例
以下是一个使用Argon2id进行密码哈希的示例:
import 'package:cryptography_plus/cryptography_plus.dart';
Future<void> main() async {
final algorithm = Argon2id(
memory: 10 * 1000, // 10 MB
parallelism: 2, // 使用最多两个CPU核心
iterations: 1, // 为了更高的安全性,通常应增加memory参数而不是iterations
hashLength: 32, // 返回哈希的字节数
);
final secretKey = await algorithm.deriveKeyFromPassword(
password: 'qwerty',
nonce: [1, 2, 3],
);
final secretKeyBytes = await secretKey.extractBytes();
print('Hash: ${secretKeyBytes}');
}
哈希示例
以下是一个使用Sha256进行哈希的示例:
import 'package:cryptography_plus/cryptography_plus.dart';
Future<void> main() async {
final sink = Sha256().newHashSink();
// 添加所有部分的认证消息
sink.add([1, 2, 3]);
sink.add([4, 5]);
sink.add([6]);
// 计算哈希
sink.close();
final hash = await sink.hash();
print('SHA-256 hash: ${hash.bytes}');
}
通过这些示例,你可以更好地理解如何在Flutter应用中使用cryptography_plus
包进行加密、解密和其他密码学操作。希望这些信息对你有帮助!如果有任何问题,请随时提问。
更多关于Flutter加密解密插件cryptography_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter加密解密插件cryptography_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用Flutter中的cryptography_plus
插件进行加密和解密的代码示例。这个插件提供了多种加密算法,包括AES、RSA等。以下示例将展示如何使用AES进行对称加密和解密。
首先,你需要在你的pubspec.yaml
文件中添加cryptography_plus
依赖:
dependencies:
flutter:
sdk: flutter
cryptography_plus: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来是一个简单的示例,展示如何使用AES进行加密和解密:
import 'package:flutter/material.dart';
import 'package:cryptography_plus/cryptography_plus.dart';
import 'dart:typed_data';
import 'dart:convert';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String originalText = "Hello, Flutter!";
String encryptedText = "";
String decryptedText = "";
@override
void initState() {
super.initState();
encryptAndDecrypt();
}
Future<void> encryptAndDecrypt() async {
// 生成一个随机的AES密钥
final aesKey = await AesKey.generateSecureRandom(length: 32);
final iv = await Iv.generateSecureRandom(length: 16); // 初始化向量
// 加密
final encrypter = AesEncrypter(AesGcm(aesKey));
final encrypted = encrypter.encrypt(
originalText.codeUnits,
iv: iv,
);
setState(() {
encryptedText = base64Encode(encrypted.bytes);
});
// 解密
final decrypted = encrypter.decrypt(
Encrypted(bytes: base64Decode(encryptedText), nonce: encrypted.nonce),
);
setState(() {
decryptedText = String.fromCharCodes(decrypted);
});
print("Original Text: $originalText");
print("Encrypted Text: $encryptedText");
print("Decrypted Text: $decryptedText");
}
@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(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Original Text: $originalText"),
SizedBox(height: 16),
Text("Encrypted Text: $encryptedText"),
SizedBox(height: 16),
Text("Decrypted Text: $decryptedText"),
],
),
),
),
);
}
}
代码说明:
- 依赖添加:在
pubspec.yaml
中添加cryptography_plus
依赖。 - 密钥和初始化向量生成:使用
AesKey.generateSecureRandom
和Iv.generateSecureRandom
生成AES密钥和初始化向量。 - 加密:创建一个
AesEncrypter
实例,并使用encrypt
方法对原始文本进行加密。加密结果包括密文和初始化向量(nonce)。 - 解密:使用相同的
AesEncrypter
实例和decrypt
方法对加密结果进行解密。注意,解密时需要提供正确的密文和初始化向量。 - 显示结果:在Flutter应用中显示原始文本、加密文本和解密文本。
注意事项:
- 在实际应用中,密钥管理非常重要,不应硬编码在代码中。
- 加密和解密操作是异步的,因此使用了
Future
和async/await
。 cryptography_plus
插件可能还有其他高级用法和功能,请参考其官方文档获取更多信息。
希望这个示例能帮助你理解如何在Flutter中使用cryptography_plus
插件进行加密和解密。