Flutter加密密钥管理插件crypto_keys_plus的使用

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

Flutter加密密钥管理插件crypto_keys_plus的使用

简介

crypto_keys_plus 是一个用于执行加密签名/验证和加密/解密的库。它底层使用了 pointycastle,但提供了更方便的 API。

使用方法

签名

以下是一个简单的签名示例:

import 'package:crypto_keys/crypto_keys.dart';
import 'dart:typed_data';

void main() {
  // 从 JWK 表示创建密钥对
  var keyPair = KeyPair.fromJwk({
    "kty": "oct",
    "k": "AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75"
        "aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow"
  });

  // 密钥对包含私钥和公钥,如果在构造时没有提供必要的信息,其中一个可能是 null
  // 私钥可以用于签名
  var privateKey = keyPair.privateKey;

  // 使用 HMAC/SHA-256 算法为密钥创建签名器
  var signer = privateKey.createSigner(algorithms.signing.hmac.sha256);

  // 签名一些内容,以保护其完整性
  var content = "It's me, really me";
  var signature = signer.sign(content.codeUnits);

  print("Signing '$content'");
  print("Signature: ${signature.data}");

  // 公钥可以用于验证签名
  var publicKey = keyPair.publicKey;

  // 使用指定算法为密钥创建验证器
  var verifier = publicKey.createVerifier(algorithms.signing.hmac.sha256);

  var verified = verifier.verify(Uint8List.fromList(content.codeUnits), signature);
  if (verified) {
    print("Verification succeeded");
  } else {
    print("Verification failed");
  }
}

加密

以下是一个简单的加密示例:

import 'package:crypto_keys/crypto_keys.dart';
import 'dart:typed_data';

void main() {
  // 生成一个新的随机对称密钥对
  var keyPair = KeyPair.generateSymmetric(128);

  // 使用公钥创建使用 AES/GCM 算法的加密器
  var encrypter = keyPair.publicKey.createEncrypter(algorithms.encryption.aes.gcm);

  // 使用附加认证数据(AAD)加密内容以保护其完整性
  var content = "A very secret text";
  var aad = "It is me";
  var encrypted = encrypter.encrypt(Uint8List.fromList(content.codeUnits),
      additionalAuthenticatedData: Uint8List.fromList(aad.codeUnits));

  print("Encrypting '$content'");
  print("Ciphertext: ${encrypted.data}");
  print("Authentication tag: ${encrypted.authenticationTag}");

  // 使用私钥创建解密器
  var decrypter = keyPair.privateKey.createEncrypter(algorithms.encryption.aes.gcm);

  // 解密并验证认证标签
  var decrypted = decrypter.decrypt(encrypted);

  print("Decrypted text: '${String.fromCharCodes(decrypted)}'");
}

特性和问题

请在 GitHub 问题跟踪器 上提交功能请求和错误报告。

赞助

创建和维护这个包需要大量时间。如果你喜欢这个结果,请考虑 赞助。你的支持将帮助我进一步改进和支持这个项目。

示例代码

你可以在包的根目录下运行以下命令来查看示例:

  • 运行 pub run example/signing_example.dart 查看签名示例。
  • 运行 pub run example/encryption_example.dart 查看加密示例。

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

1 回复

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


当然,下面是一个关于如何使用 crypto_keys_plus 插件在 Flutter 中进行加密密钥管理的代码示例。crypto_keys_plus 是一个用于在 Flutter 应用中安全存储和管理加密密钥的插件。

首先,确保在你的 pubspec.yaml 文件中添加 crypto_keys_plus 依赖:

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

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

示例代码

以下是一个简单的示例,展示了如何使用 crypto_keys_plus 来生成、存储和检索加密密钥。

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _retrievedKey = "";

  @override
  void initState() {
    super.initState();
    _initializeKeys();
  }

  Future<void> _initializeKeys() async {
    try {
      // 生成一个新的密钥对
      KeyPair keyPair = await CryptoKeysPlus.generateKeyPair(
        algorithm: 'RSA',
        hash: 'SHA-256',
        modulusLength: 2048,
      );

      // 存储公钥
      await CryptoKeysPlus.storePublicKey(
        keyAlias: 'myPublicKey',
        publicKey: keyPair.publicKey,
      );

      // 存储私钥
      await CryptoKeysPlus.storePrivateKey(
        keyAlias: 'myPrivateKey',
        privateKey: keyPair.privateKey,
      );

      // 检索并显示公钥
      String publicKey = await CryptoKeysPlus.retrievePublicKey('myPublicKey');
      setState(() {
        _retrievedKey = "Retrieved Public Key: $publicKey";
      });

      // 如果你需要检索私钥,使用以下代码(注意:在实际应用中,不应直接在UI中显示私钥)
      // String privateKey = await CryptoKeysPlus.retrievePrivateKey('myPrivateKey');
      // print("Retrieved Private Key: $privateKey");

    } catch (e) {
      print("Error: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('crypto_keys_plus Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(_retrievedKey),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 权限:在某些平台上(如 Android),你可能需要在 AndroidManifest.xml 中添加必要的权限来访问密钥存储。

  2. 安全性:私钥是非常敏感的,应该始终在安全的上下文中处理,避免直接在 UI 组件中显示或传输。

  3. 错误处理:示例代码中的错误处理相对简单,实际项目中应根据需求进行更详细的错误处理和日志记录。

  4. 依赖版本:确保使用最新版本的 crypto_keys_plus 插件,以获取最新的功能和安全修复。

通过上述代码示例,你可以在 Flutter 应用中安全地生成、存储和检索加密密钥。如果你有更复杂的需求,例如使用对称加密算法或更复杂的密钥管理策略,建议查阅 crypto_keys_plus 的官方文档以获取更多信息。

回到顶部