Flutter加密解密插件rust_crypto的使用

Flutter加密解密插件rust_crypto的使用

rust_crypto 是一个用于在 Flutter 中进行哈希、HMAC、Argon2 密码和 AES-GCM-SIV 加密的插件。它还支持 SHA-1、SHA-2、MD5、BLAKE3 和 CRC32 的摘要计算。该插件利用了 WASM 来执行 WebAssembly。

示例

您可以在以下链接中找到部署的示例:

开发

开发过程中可以使用以下命令生成 WASM 文件并运行测试:

dart run ../../dart_wit_component/wasm_wit_component/bin/generate.dart rust_crypto_wasm/wit/rust-crypto.wit lib/src/rust_crypto_wit.gen.dart
fvm dart run test/rust_crypto_test.dart

完整示例

以下是使用 rust_crypto 插件的一个完整示例。该示例展示了如何在 Flutter 应用程序中使用该插件来计算字符串的 SHA-256 和 SHA-512 哈希值。

import 'dart:convert' show Utf8Encoder;

import 'package:flutter/material.dart';
import 'package:rust_crypto/rust_crypto.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Rust Crypto Example"),
        ),
        body: Center(
          child: RustCryptoPage(),
        ),
      ),
    );
  }
}

class RustCryptoPage extends StatefulWidget {
  @override
  _RustCryptoPageState createState() => _RustCryptoPageState();
}

class _RustCryptoPageState extends State<RustCryptoPage> {
  String _sha256Result = '';
  String _sha512Result = '';

  Future<void> _calculateHashes() async {
    final rustCrypto = await rustCryptoInstance(
      wasiConfig: WasiConfig(preopenedDirs: [], webBrowserFileSystem: {}),
    );
    final bytes = const Utf8Encoder().convert('hello world');
    
    setState(() {
      _sha256Result = rustCrypto.sha2.sha256(bytes: bytes);
      _sha512Result = rustCrypto.sha2.sha512(bytes: bytes);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: _calculateHashes,
          child: Text('Calculate Hashes'),
        ),
        SizedBox(height: 20),
        Text('SHA-256: $_sha256Result'),
        SizedBox(height: 10),
        Text('SHA-512: $_sha512Result'),
      ],
    );
  }
}

解释

  1. 导入依赖:

    import 'dart:convert' show Utf8Encoder;
    import 'package:flutter/material.dart';
    import 'package:rust_crypto/rust_crypto.dart';
    
  2. 主应用类:

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text("Rust Crypto Example"),
            ),
            body: Center(
              child: RustCryptoPage(),
            ),
          ),
        );
      }
    }
    
  3. RustCryptoPage 类:

    class RustCryptoPage extends StatefulWidget {
      @override
      _RustCryptoPageState createState() => _RustCryptoPageState();
    }
    
    class _RustCryptoPageState extends State<RustCryptoPage> {
      String _sha256Result = '';
      String _sha512Result = '';
    
      Future<void> _calculateHashes() async {
        final rustCrypto = await rustCryptoInstance(
          wasiConfig: WasiConfig(preopenedDirs: [], webBrowserFileSystem: {}),
        );
        final bytes = const Utf8Encoder().convert('hello world');
        
        setState(() {
          _sha256Result = rustCrypto.sha2.sha256(bytes: bytes);
          _sha512Result = rustCrypto.sha2.sha512(bytes: bytes);
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _calculateHashes,
              child: Text('Calculate Hashes'),
            ),
            SizedBox(height: 20),
            Text('SHA-256: $_sha256Result'),
            SizedBox(height: 10),
            Text('SHA-512: $_sha512Result'),
          ],
        );
      }
    }
    

更多关于Flutter加密解密插件rust_crypto的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加密解密插件rust_crypto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用Rust进行加密解密操作可以通过flutter_rust_bridge插件来实现。flutter_rust_bridge允许你在Flutter中调用Rust代码,从而利用Rust的强大性能和安全特性。下面是一个简单的示例,展示如何在Flutter中使用Rust进行加密和解密操作。

1. 创建Flutter项目

首先,创建一个新的Flutter项目:

flutter create flutter_rust_crypto_example
cd flutter_rust_crypto_example

2. 添加flutter_rust_bridge依赖

pubspec.yaml中添加flutter_rust_bridge依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_rust_bridge: ^1.0.0

然后运行flutter pub get来获取依赖。

3. 创建Rust项目

在Flutter项目的根目录下创建一个Rust项目:

cargo new --lib native

编辑native/Cargo.toml文件,添加flutter_rust_bridgerust-crypto依赖:

[package]
name = "native"
version = "0.1.0"
edition = "2018"

[lib]
crate-type = ["cdylib"]

[dependencies]
flutter_rust_bridge = "1.0.0"
rust-crypto = "0.2.36"

4. 编写Rust代码

native/src/lib.rs中编写加密解密的Rust代码:

use flutter_rust_bridge::frb;
use crypto::symmetriccipher::BlockEncryptor;
use crypto::aes::cbc_encryptor;
use crypto::buffer::{RefReadBuffer, RefWriteBuffer, BufferResult};
use crypto::blockmodes::PkcsPadding;
use crypto::symmetriccipher::BlockDecryptor;
use crypto::aes::cbc_decryptor;

#[frb]
pub fn encrypt(data: Vec<u8>, key: Vec<u8>, iv: Vec<u8>) -> Vec<u8> {
    let mut encryptor = cbc_encryptor(
        crypto::aes::KeySize::KeySize256,
        &key,
        &iv,
        PkcsPadding,
    );

    let mut result = Vec::new();
    let mut read_buffer = RefReadBuffer::new(&data);
    let mut buffer = [0; 4096];
    let mut write_buffer = RefWriteBuffer::new(&mut buffer);

    loop {
        let result_code = encryptor.encrypt(&mut read_buffer, &mut write_buffer, true);
        result.extend(write_buffer.take_read_buffer().take_remaining().iter().cloned());

        match result_code {
            BufferResult::BufferUnderflow => break,
            BufferResult::BufferOverflow => {}
        }
    }

    result
}

#[frb]
pub fn decrypt(data: Vec<u8>, key: Vec<u8>, iv: Vec<u8>) -> Vec<u8> {
    let mut decryptor = cbc_decryptor(
        crypto::aes::KeySize::KeySize256,
        &key,
        &iv,
        PkcsPadding,
    );

    let mut result = Vec::new();
    let mut read_buffer = RefReadBuffer::new(&data);
    let mut buffer = [0; 4096];
    let mut write_buffer = RefWriteBuffer::new(&mut buffer);

    loop {
        let result_code = decryptor.decrypt(&mut read_buffer, &mut write_buffer, true);
        result.extend(write_buffer.take_read_buffer().take_remaining().iter().cloned());

        match result_code {
            BufferResult::BufferUnderflow => break,
            BufferResult::BufferOverflow => {}
        }
    }

    result
}

5. 生成Flutter-Rust桥接代码

在Flutter项目中运行以下命令来生成桥接代码:

flutter_rust_bridge_codegen --rust-input native/src/lib.rs --dart-output lib/bridge_generated.dart --llvm-path /path/to/llvm

确保你已经安装了flutter_rust_bridge_codegen,并且指定了正确的LLVM路径。

6. 在Flutter中调用Rust函数

lib/main.dart中调用Rust的加密解密函数:

import 'package:flutter/material.dart';
import 'bridge_generated.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Rust Crypto Example')),
        body: Center(
          child: FutureBuilder(
            future: _performCrypto(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return Text('Result: ${snapshot.data}');
              }
            },
          ),
        ),
      ),
    );
  }

  Future<String> _performCrypto() async {
    final api = NativeImpl();

    final key = List<int>.generate(32, (i) => i);
    final iv = List<int>.generate(16, (i) => i);
    final data = [1, 2, 3, 4, 5];

    final encrypted = await api.encrypt(data, key, iv);
    final decrypted = await api.decrypt(encrypted, key, iv);

    return 'Encrypted: $encrypted\nDecrypted: $decrypted';
  }
}

7. 运行项目

确保你已经配置好了Rust的编译环境,然后运行Flutter项目:

flutter run
回到顶部