Flutter加密库插件sodium_libs的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter加密库插件sodium_libs的使用

sodium_libs 是一个Flutter包,它为 sodium 提供了低级别的libsodium二进制文件,以便更容易地使用。它扩展了 sodium 包,并提供了适用于所有主要Flutter平台(Android, iOS, Linux, Windows, macOS, Web)的二进制文件。

Features

  • 为Flutter扩展 sodium ,包含各平台的二进制文件
  • 在所有主要Flutter平台上轻松、无痛初始化(Android, iOS, Linux, Windows, macOS, Web)
  • 二进制文件要么直接包含,要么在编译时自动下载/构建

注意: 此包仅处理每个支持平台的libsodium二进制文件,并将它们提供给 sodium 。有关实际API的更多信息,请参阅该包的文档。

Installation

只需将 sodium_libs 添加到您的 pubspec.yaml 文件中并运行 pub getflutter pub get 即可安装。

Web

对于Web项目,由于JS库不能直接捆绑在库中,因此需要额外的安装步骤。您可以通过运行以下命令来自动添加 sodium.js 到项目中:

flutter pub run sodium_libs:update_web [--sumo] [--no-edit-index] [<target_directory>]

参数说明:

  • --sumo :可选参数,如果指定,则下载Sumo版本的 sodium.js 。此版本更大,但包含所有API。
  • --no-edit-index :禁用自动修改 index.html 的行为,默认情况下, index.html 会被修改以自动加载 sodium.js ,这可以加快应用的初始化速度并允许调试。
  • <target_directory> :如果您的Web项目文件不在默认的 web 目录中,您可以指定自定义目录。

Linux

在Linux上,您可以选择使用 pkg-config 来解析libsodium,而不是使用捆绑的库。这将使Linux构建链接到系统库,前提是已安装该库。要启用此模式,只需在编译前设置 LIBSODIUM_USE_PKGCONFIG 环境变量即可:

export LIBSODIUM_USE_PKGCONFIG=1
flutter clean # 推荐执行以确保没有缓存的构建工件
flutter build linux

Usage

sodium_libs 的API使用方式与 sodium 包完全相同。唯一的区别是 sodium_libs 简化了该包的初始化。要初始化它,只需执行以下操作:

import 'package:sodium_libs/sodium_libs.dart';

// 在渲染第一帧之前调用
WidgetsFlutterBinding.ensureInitialized();

final sodium = await SodiumInit.init();
// 您现在有了一个Sodium实例,更多用法请参考sodium包

如果您想使用 SodiumSumo API,请使用以下代码代替,并记住使用 --sumo 参数初始化Web项目,否则初始化将会失败:

import 'package:sodium_libs/sodium_libs_sumo.dart';

// 在渲染第一帧之前调用
WidgetsFlutterBinding.ensureInitialized();

final sodium = await SodiumSumoInit.init();
// 您现在有了一个SodiumSumo实例,更多用法请参考sodium包

有关 SodiumSodiumSumo 之间的差异,请参阅 Sodium vs SodiumSumo

Documentation

文档可以在 pub.dev 上找到。完整的示例可以在 sodium_libs/example 中查看。

示例代码

下面是一个完整的示例代码,演示如何在Flutter应用程序中使用 sodium_libs :

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

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

class MyApp extends StatelessWidget {
  static const resultTextKey = Key('resultText');

  final Sodium? preInitSodium;

  const MyApp({
    super.key,
    this.preInitSodium,
  });

  @override
  Widget build(BuildContext context) => MaterialApp(
        title: 'sodium_libs example app',
        home: Scaffold(
          appBar: AppBar(
            title: const Text('sodium_libs example app'),
          ),
          body: Center(
            child: FutureBuilder<Sodium>(
              future: preInitSodium != null
                  ? Future.value(preInitSodium)
                  : SodiumInit.init(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return Text(
                    'Loaded libsodium with version ${snapshot.data!.version}',
                    key: resultTextKey,
                  );
                }

                if (snapshot.hasError) {
                  return Text(
                    'Failed to load libsodium with error: ${snapshot.error}\n'
                    '${snapshot.stackTrace}',
                    key: resultTextKey,
                    style: TextStyle(color: Colors.red.shade900),
                  );
                }

                return const CircularProgressIndicator();
              },
            ),
          ),
        ),
      );
}

这个示例展示了如何在Flutter应用中初始化 sodium_libs 并显示加载的libsodium版本。希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用sodium_libs加密库插件的示例代码。sodium_libs是一个基于libsodium库的Flutter插件,用于提供高级的加密功能。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sodium_libs: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来下载依赖。

2. 初始化加密库

在使用任何加密功能之前,你需要初始化libsodium库。这通常在应用启动时完成。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化libsodium库
  await SodiumLibs.init();
  
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SodiumLibs Demo'),
        ),
        body: Center(
          child: EncryptionDemo(),
        ),
      ),
    );
  }
}

3. 加密和解密示例

下面是一个简单的加密和解密字符串的示例:

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

class EncryptionDemo extends StatefulWidget {
  @override
  _EncryptionDemoState createState() => _EncryptionDemoState();
}

class _EncryptionDemoState extends State<EncryptionDemo> {
  final _controller = TextEditingController();
  late String _encryptedText = '';
  late String _decryptedText = '';

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _encrypt() async {
    String plaintext = _controller.text;
    if (plaintext.isEmpty) return;

    // 生成随机密钥和nonce
    final key = await SodiumLibs.randomBytes(SodiumLibs.cryptoSecretboxKEYBYTES);
    final nonce = await SodiumLibs.randomBytes(SodiumLibs.cryptoSecretboxNONCEBYTES);

    // 加密
    final encrypted = await SodiumLibs.cryptoSecretboxEasy(
      plaintext.codeUnits,
      nonce,
      key
    );

    // 转换为字符串表示(实际使用时建议编码为Base64或Hex)
    setState(() {
      _encryptedText = String.fromCharCodes(encrypted);
    });
  }

  void _decrypt() async {
    if (_encryptedText.isEmpty) return;

    // 提取密钥和nonce(实际使用时需要安全存储和传递)
    final key = await SodiumLibs.randomBytes(SodiumLibs.cryptoSecretboxKEYBYTES); // 示例中重新生成,实际中应使用加密时相同的密钥
    final nonce = await SodiumLibs.randomBytes(SodiumLibs.cryptoSecretboxNONCEBYTES); // 示例中重新生成,实际中应使用加密时相同的nonce

    // 转换为字节数组
    final encryptedBytes = _encryptedText.codeUnits;

    // 解密
    try {
      final decrypted = await SodiumLibs.cryptoSecretboxOpenEasy(
        encryptedBytes,
        nonce,
        key
      );
      setState(() {
        _decryptedText = String.fromCharCodes(decrypted);
      });
    } catch (_) {
      setState(() {
        _decryptedText = '解密失败';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        TextField(
          controller: _controller,
          decoration: InputDecoration(labelText: '输入明文'),
        ),
        SizedBox(height: 20),
        ElevatedButton(onPressed: _encrypt, child: Text('加密')),
        SizedBox(height: 20),
        Text('加密后的文本: $_encryptedText'),
        SizedBox(height: 20),
        ElevatedButton(onPressed: _decrypt, child: Text('解密')),
        SizedBox(height: 20),
        Text('解密后的文本: $_decryptedText'),
      ],
    );
  }
}

注意事项

  1. 密钥和Nonce的管理:在实际应用中,密钥和nonce需要安全地存储和传递。示例中为了简单起见,每次生成新的密钥和nonce,这是不安全的。
  2. 异常处理:加密和解密过程中可能会抛出异常,需要妥善处理。
  3. 编码转换:示例中直接将字节数组转换为字符串表示,实际应用中建议使用Base64或Hex编码。

通过以上代码,你可以在Flutter项目中使用sodium_libs进行基本的加密和解密操作。根据你的需求,可以进一步扩展和自定义这些功能。

回到顶部