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文件中。因此,这是您应该进行更改或添加的地方。之后,您需要重新构建库。

要求

  1. 安装Rust(默认工具链安装)
  2. 安装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.shbuild-android.sh文件所做的事情:

  1. 运行rustup添加目标
  2. 从rust代码生成dart桥梁
  3. 为每个目标生成rust代码的二进制文件
  4. 为每个平台构建库(iOS xcframework和Android jniLib)

要求

主要要求

  1. 安装Rust(默认工具链安装)
  2. 安装flutter_rust_bridge_codegen
  3. 安装XCode完整版本
  4. 安装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构建要求

  1. 安装Cargo NDK
  2. 为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

1 回复

更多关于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'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

说明:

  1. 依赖引入:在pubspec.yaml中添加dart_rust_encrypt依赖。
  2. 初始化与释放:在initState中初始化RustEncrypt实例,在dispose中释放资源。
  3. 加密:使用encrypt方法进行加密,需要传入明文、密钥和IV(初始化向量)。
  4. 解密:使用decrypt方法进行解密,同样需要传入密文、密钥和IV。

注意:

  • 密钥和IV的长度取决于所使用的加密算法。AES-256-CBC需要32字节的密钥和16字节的IV。
  • 示例代码中的密钥和IV是硬编码的,实际应用中应妥善管理这些敏感信息。

这个示例展示了如何在Flutter应用中使用dart_rust_encrypt插件进行基本的加密和解密操作。根据你的需求,你可能需要调整加密模式、密钥管理等细节。

回到顶部