Flutter加密插件dart_rust_encrypt的使用
Flutter加密插件dart_rust_encrypt的使用
dart_rust_encrypt
这是一个Dart插件包(参见此链接 获取flutter包装器),用于使用Rust实现常见的数据加密算法和工具。
概览
该插件是为纯用Rust编写的哈希和加密算法(如SHA3-256)提供封装/桥接,以利用Rust的安全性和速度。下图展示了相同20MB字符串在dart实现和Rust实现之间进行SHA3-256哈希的速度差异:
功能特性
随着项目的增长,此列表将不断更新:
- SHA3-256
- SHA3-512
- PBKDF2-SHA3-512
安装
要使用此插件,请在您的pubspec.yaml
文件中添加dart_rust_encrypt
作为依赖项。
dependencies:
dart_rust_encrypt:
然后运行:
flutter pub get
使用方法
在您的Dart文件中导入该包:
import 'package:dart_rust_encrypt/dart_rust_encrypt.dart';
初始化和使用
import 'dart:typed_data';
import 'package:dart_rust_encrypt/dart_rust_encrypt.dart';
import 'dart:convert';
void main(List<String> args) async {
final dartRustEncrypt = createWrapper(DynamicLibrary.open(args[0]));
final hashed = await dartRustEncrypt.sha3_256(Uint8List.fromList(utf8.encode('Hello World')));
print(hashed);
}
提示: 请阅读提供的示例注释,了解如何将生成的库路径传递给dart编译器。
示例
完整的示例位于example文件夹中。
从源码构建(纯Dart)
如有必要修改Rust功能,需要重新构建二进制文件。为此,您需要在机器上安装一些要求,然后使用以下命令重新构建库。
所有在Rust端提供的功能都在api.rs
文件中。因此,这是您应该进行更改或添加的地方。之后,您需要重新构建库。
要求
- 安装Rust(默认工具链安装)
- 安装flutter_rust_bridge_codegen:
brew install desdaemon/repo/flutter_rust_bridge_codegen
构建
flutter_rust_bridge_codegen --rust-input path/to/api.rs \
--dart-output path/to/bridge_generated.dart
cargo build --release
现在您可以使用target/realse/libdart_rust_encrypt.dylib
在您的项目中(.dylib
用于macOS机器,其他平台需要其他格式的库,如.so
,.dll
)。更多详情请参阅flutter_rust_bridge文档。
从源码构建(Flutter插件)
您可以使用提供的脚本在flutter中为iOS和Android构建库。更多详情这些是build-ios.sh
和build-android.sh
文件所做的事情:
- 运行rustup添加目标
- 从rust代码生成dart桥梁
- 为每个目标生成rust代码的二进制文件
- 为每个平台构建库(iOS xcframework和Android jniLib)
要求
主要要求
- 安装Rust(默认工具链安装)
- 安装flutter_rust_bridge_codegen
- 安装XCode完整版本
- 安装Android NDK(您可以使用Android Studio来安装)
iOS & macOS构建要求
显然,您需要一台MacOS机器来构建iOS库。还需要在机器上安装XCode,您可以在App Store中安装它。然后:
运行rustup target add {target_name}
为每个要构建的目标添加目标。例如:rustup target add aarch64-apple-ios x86_64-apple-ios
完整的iOS & macOS支持目标列表:
rustup target add aarch64-apple-ios
rustup target add x86_64-apple-ios
rustup target add aarch64-apple-ios-sim
rustup target add x86_64-apple-darwin
rustup target add aarch64-apple-darwin
Android构建要求
- 安装Cargo NDK
- 为rustup添加所需目标
与iOS部分类似,为了获得完整的Android支持:
rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi
rustup target add i686-linux-android
rustup target add x86_64-linux-android
构建
在scripts
文件夹中运行脚本后,您可以在scripts/platform-builds
目录中找到为flutter生成的框架。
- Android构建:
android.tar.gz
- iOS构建:
DartRustEncrypt.xcframework.zip
现在您可以使用这些库在flutter插件包装器中(参见此链接)。因此,每个生成的库应复制粘贴到我们的flutter插件目录中的相应平台目录。
- Android: 将
android.tar.gz
复制到flutter_rust_encrypt/android/
- iOS: 将
DartRustEncrypt.xcframework.zip
复制到flutter_rust_encrypt/ios/Frameworks/
无需手动解压这些文件,因为注入步骤在每个平台构建源(已在提供的flutter包装器插件中)会为我们完成。您可以在以下位置查看这些步骤:
- iOS:
flutter_rust_encrypt/ios/flutter_rust_encrypt.podspec
- Android:
flutter_rust_encrypt/android/build.gradle
(借助CMakeLists.txt
)
还需要将两个生成的头文件frb.h
替换到我们flutter插件目录中的相应目录:
- iOS:
flutter_rust_encrypt/ios/Classes/
- macOS:
flutter_rust_encrypt/macos/Classes/
现在您可以将flutter包装器插件添加到项目中,并使用Rust的力量和速度。
示例代码
以下是完整的示例代码:
import 'dart:convert';
import 'dart:ffi';
import 'dart:typed_data';
import 'package:dart_rust_encrypt/dart_rust_encrypt.dart';
import 'package:pointycastle/export.dart';
// 如果您在本地运行此示例,您需要传递
// .so rust构建文件的绝对地址(.dylib在mac上)
// 并与`dart run`一起传递,如下所示:
/// ```
/// dart run this_example_path.dart dylib_absolute_path.dylib
/// ```
/// 例如:
/// ```
/// dart run dart_rust_encrypt_example.dart /Users/[username]/Desktop/dart_rust_encrypt/target/release/libdart_rust_encrypt.dylib
/// ```
void main(List<String> args) async {
final input = Uint8List.fromList(utf8.encode('Hello World'));
final salt = Uint8List.fromList(utf8.encode('123456789'));
const iterations = 1024;
const keyLength = 64;
final dartRustEncrypt = createWrapper(DynamicLibrary.open(args[0]));
final derivator = PBKDF2KeyDerivator(Mac('SHA3-512/HMAC'))
..reset()
..init(Pbkdf2Parameters(salt, iterations, keyLength));
var pointyOut = derivator.process(input);
var rustOut = await dartRustEncrypt.pbkdf2_Sha3_512(
input: input,
salt: salt,
iterations: iterations,
keyLength: keyLength,
);
final sha3digest = SHA3Digest(256);
pointyOut = sha3digest.process(pointyOut);
rustOut = await dartRustEncrypt.sha3_256(rustOut);
// print('Pointy Castle: \n$pointyOut\n');
// print('Rust: \n$rustOut');
}
更多关于Flutter加密插件dart_rust_encrypt的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter加密插件dart_rust_encrypt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用dart_rust_encrypt
插件进行加密和解密的示例代码。这个插件利用了Rust的高效性来进行加密操作,并通过Dart的FFI(外部函数接口)与Rust代码进行交互。
首先,确保你已经在pubspec.yaml
文件中添加了dart_rust_encrypt
依赖:
dependencies:
flutter:
sdk: flutter
dart_rust_encrypt: ^最新版本号 # 请替换为实际可用的最新版本号
然后,运行flutter pub get
来获取依赖。
接下来,是一个使用dart_rust_encrypt
进行加密和解密的示例代码:
import 'package:flutter/material.dart';
import 'package:dart_rust_encrypt/dart_rust_encrypt.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? encryptedText;
String? decryptedText;
String plainText = "Hello, Flutter and Rust!";
late RustEncrypt rustEncrypt;
@override
void initState() {
super.initState();
// 初始化RustEncrypt实例
rustEncrypt = RustEncrypt();
}
@override
void dispose() {
// 释放RustEncrypt实例资源
rustEncrypt.dispose();
super.dispose();
}
void encryptText() async {
// 使用AES-256-CBC加密模式进行加密
String key = '01234567890123456789012345678901'; // 32字节密钥
String iv = '0123456789012345'; // 16字节IV
String encrypted = await rustEncrypt.encrypt(plainText!, key, iv);
setState(() {
encryptedText = encrypted;
decryptedText = null;
});
}
void decryptText() async {
if (encryptedText == null) return;
String key = '01234567890123456789012345678901'; // 与加密时相同的密钥
String iv = '0123456789012345'; // 与加密时相同的IV
String decrypted = await rustEncrypt.decrypt(encryptedText!, key, iv);
setState(() {
decryptedText = decrypted;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Rust Encrypt Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Plain Text: $plainText'),
SizedBox(height: 16),
if (encryptedText != null)
Text('Encrypted Text: $encryptedText'),
SizedBox(height: 16),
if (decryptedText != null)
Text('Decrypted Text: $decryptedText'),
SizedBox(height: 24),
ElevatedButton(
onPressed: encryptText,
child: Text('Encrypt'),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: decryptText,
child: Text('Decrypt'),
),
],
),
),
),
);
}
}
说明:
- 依赖引入:在
pubspec.yaml
中添加dart_rust_encrypt
依赖。 - 初始化与释放:在
initState
中初始化RustEncrypt
实例,在dispose
中释放资源。 - 加密:使用
encrypt
方法进行加密,需要传入明文、密钥和IV(初始化向量)。 - 解密:使用
decrypt
方法进行解密,同样需要传入密文、密钥和IV。
注意:
- 密钥和IV的长度取决于所使用的加密算法。AES-256-CBC需要32字节的密钥和16字节的IV。
- 示例代码中的密钥和IV是硬编码的,实际应用中应妥善管理这些敏感信息。
这个示例展示了如何在Flutter应用中使用dart_rust_encrypt
插件进行基本的加密和解密操作。根据你的需求,你可能需要调整加密模式、密钥管理等细节。