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'),
],
);
}
}
解释
-
导入依赖:
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(), ), ), ); } }
-
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
更多关于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_bridge
和rust-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