Flutter加密通信插件libsodium的使用

Flutter加密通信插件libsodium的使用

在您的Dart项目中添加依赖项:

dependencies:
  ...
  libsodium: ^0.2.0
  flutter_sodium: ^0.2.0

导入插件并初始化它。Sodium.init() 初始化插件,并应在调用任何其他由flutter_sodium提供的函数之前调用。

import 'package:libsodium/libsodium.dart';

// 初始化sodium
Sodium.init();

使用示例

// 密码哈希(使用Argon)
final password = 'my password';
final str = PasswordHash.hashStringStorage(password);

print(str);

// 验证哈希字符串
final valid = PasswordHash.verifyStorage(str, password);

assert(valid);

此项目包含一个详尽的示例应用程序,其中包含可运行的代码示例。务必查看!

API覆盖

该libsodium插件实现了以下libsodium API:

  • crypto_aead
  • crypto_auth
  • crypto_box
  • crypto_generichash
  • crypto_hash
  • crypto_kdf
  • crypto_kx
  • crypto_onetimeauth
  • crypto_pwhash
  • crypto_scalarmult
  • crypto_secretbox
  • crypto_secretstream
  • crypto_shorthash
  • crypto_sign
  • crypto_stream
  • randombytes
  • sodium_version

API覆盖并不完全,可以在issue #61中跟踪进度。

Dart API

该插件包括一个核心API,将本地libsodium函数1:1映射到Dart等效函数。核心API可在类Sodium中找到。Dart命名约定用于核心API函数名。例如,本地libsodium函数crypto_pwhash_str在flutter中可用作Sodium.cryptoPwhashStr

此外,flutter_sodium还包括一个高级的、具有观点的API,以更友好的方式访问libsodium。各种函数在单独的Dart类中可用。例如,密码哈希功能在PasswordHash类中可用。高级API依赖于核心API来完成任务。

迁移到flutter_sodium FFI

flutter_sodium的FFI实现与之前的平台通道实现不兼容。变化列表如下:

  • 整个FFI API现在是同步的,而以前的实现是完全异步的。
  • 所有硬编码的libsodium常量现在作为Sodium类的属性可用。
  • 在平台通道版本中,Android和iOS实现不同步。某些函数仅在iOS中可用,其他函数仅在Android中可用。通过FFI实现,有一个API同时覆盖两个平台。

后台线程

由于整个FFI API是同步的,您需要做一些额外的工作才能在后台线程上执行长时间运行的加密函数。幸运的是,这非常容易使用Flutter的compute函数。

以下代码片段演示了如何在后台线程上运行密码哈希。

final pw = 'hello world';
final str = await compute(PasswordHash.hashStringStorageModerate, pw);

print(str);

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

1 回复

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


在Flutter应用中使用libsodium进行加密通信需要一些步骤,以下是一个基本的指南。libsodium 是一个现代化、易于使用的加密库,支持多种加密算法。Flutter 本身并没有直接集成 libsodium,但你可以通过 Flutter 的插件系统和 Dart 的 FFI(Foreign Function Interface)来使用它。

1. 安装 flutter_libsodium 插件

首先,你需要在 pubspec.yaml 文件中添加 flutter_libsodium 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_libsodium: ^2.0.0

然后运行 flutter pub get 安装依赖。

2. 初始化 libsodium

在使用 libsodium 之前,需要先初始化它。你可以通过调用 Sodium.init() 方法来初始化:

import 'package:flutter_libsodium/flutter_libsodium.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Sodium.init();
  runApp(MyApp());
}

3. 使用 libsodium 进行加密

libsodium 提供了多种加密算法,例如 crypto_box, crypto_secretbox, crypto_sign 等。以下是一个使用 crypto_secretbox 进行加密和解密的示例:

import 'package:flutter_libsodium/flutter_libsodium.dart';
import 'package:convert/convert.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Sodium.init();

  // 生成一个随机的密钥和 nonce
  var key = Sodium.cryptoSecretBoxKeygen();
  var nonce = Sodium.cryptoSecretBoxNonce();

  // 要加密的消息
  var message = 'Hello, Flutter and libsodium!';
  var messageBytes = utf8.encode(message);

  // 加密
  var ciphertext = Sodium.cryptoSecretBoxEasy(messageBytes, nonce, key);
  print('Ciphertext: ${hex.encode(ciphertext)}');

  // 解密
  var decryptedBytes = Sodium.cryptoSecretBoxOpenEasy(ciphertext, nonce, key);
  var decryptedMessage = utf8.decode(decryptedBytes);
  print('Decrypted Message: $decryptedMessage');
}

4. 处理错误

在实际应用中,你需要注意处理可能的错误。例如,解密失败时会抛出异常:

try {
  var decryptedBytes = Sodium.cryptoSecretBoxOpenEasy(ciphertext, nonce, key);
  var decryptedMessage = utf8.decode(decryptedBytes);
  print('Decrypted Message: $decryptedMessage');
} catch (e) {
  print('Decryption failed: $e');
}
回到顶部