flutter_sodium

使用 flutter_sodium,您可以在 Flutter 应用中访问现代、易于使用的 libsodium 加密库。一套加密 API 支持 Android 和 iOS。

入门

在您的 Flutter 项目中添加依赖项

dependencies:
  ...
  flutter_sodium: ^0.1.6

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

import 'package:flutter_sodium/flutter_sodium.dart';

// initialize sodium
Sodium.init();

使用示例

// Password hashing (using Argon)
final password = 'my password';
final str = PasswordHash.hashStringStorage(password);

print(str);

// verify hash str
final valid = PasswordHash.verifyStorage(str, password);

assert(valid);

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

flutter_sodium

API 覆盖范围

flutter_sodium 插件实现了以下 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 #35 中跟踪进度。

Dart API

该插件包含一个核心 API,将原生 libsodium 函数 1:1 映射到 Dart 等效函数。核心 API 在 Sodium 类中可用。核心 API 函数名使用 Dart 命名约定。原生 libsodium 函数,如 crypto_pwhash_str,在 flutter 中可作为 Sodium.cryptoPwhashStr 使用。

flutter_sodium 还包含一个高级、有主见的 API,以 Dart 友好的方式提供对 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_sodium 的先前版本使用平台通道进行原生互操作。最新版本已重写,以充分利用 Dart FFI。FFI 提供快速的原生互操作,是 flutter_sodium 的明显选择。一个小问题是,FFI 仍处于 Beta 阶段,其 API 可能会发生变化。这可能会影响 flutter_sodium。

GitHub

https://github.com/firstfloorsoftware/flutter_sodium