Flutter加密解密插件cryptography_plus的使用

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

Flutter加密解密插件cryptography_plus的使用

概览

cryptography_plus 是一个为Dart/Flutter开发者提供的流行密码学算法包。它由gohilla.com维护,后因缺乏维护而迁移至emz-hanauer/dart-cryptography。该包在Apache License 2.0下授权。

开始使用

如果你使用Flutter,建议(但不是必须)同时导入我们的姊妹包cryptography_flutter_plus,它会在可能的情况下委托调用给Android、iOS或Mac OS X的操作系统API。

pubspec.yaml中添加依赖:

dependencies:
  cryptography_plus: ^2.7.0
  cryptography_flutter_plus: ^2.3.2 # 如果你不使用Flutter可以移除这一行

示例代码

数字签名示例

以下是使用Ed25519进行数字签名和验证的示例:

import 'package:cryptography_plus/cryptography_plus.dart';

Future<void> main() async {
  // 要签名的消息
  final message = <int>[1, 2, 3];

  // 生成密钥对
  final algorithm = Ed25519();
  final keyPair = await algorithm.newKeyPair();

  // 签名
  final signature = await algorithm.sign(
    message,
    keyPair: keyPair,
  );
  print('Signature: ${signature.bytes}');
  print('Public key: ${signature.publicKey.bytes}');

  // 验证签名
  final isSignatureCorrect = await algorithm.verify(
    message,
    signature: signature,
  );
  print('Correct signature: $isSignatureCorrect');
}

密钥协商示例

以下是一个使用X25519进行密钥协商的示例:

import 'package:cryptography_plus/cryptography_plus.dart';

Future<void> main() async {
  final algorithm = X25519();

  // Alice选择她的密钥对
  final aliceKeyPair = await algorithm.newKeyPair();

  // Alice知道Bob的公钥
  final bobKeyPair = await algorithm.newKeyPair();
  final bobPublicKey = await bobKeyPair.extractPublicKey();

  // Alice计算共享的秘密
  final sharedSecret = await algorithm.sharedSecretKey(
    keyPair: aliceKeyPair,
    remotePublicKey: bobPublicKey,
  );
  final sharedSecretBytes = await sharedSecret.extractBytes();
  print('Shared secret: $sharedSecretBytes');
}

认证加密示例

以下是一个使用AesGcm进行认证加密和解密的示例:

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

Future<void> main() async {
  // 选择加密算法
  final algorithm = AesGcm.with256bits();

  // 生成随机密钥
  final secretKey = await algorithm.newSecretKey();
  final secretKeyBytes = await secretKey.extractBytes();
  print('Secret key: ${secretKeyBytes}');

  // 加密
  final secretBox = await algorithm.encryptString(
    'Hello!',
    secretKey: secretKey,
  );
  print('Nonce: ${secretBox.nonce}'); // 自动生成的随机nonce
  print('Ciphertext: ${secretBox.cipherText}'); // 加密后的消息
  print('MAC: ${secretBox.mac}'); // 消息认证码

  // 如果你要发送secretBox,可以将所有部分连接起来:
  final concatenatedBytes = secretBox.concatenation();
  print('All three parts concatenated: $concatenatedBytes');

  // 解密
  final clearText = await algorithm.decryptString(
    secretBox,
    secretKey: secretKey,
  );
  print('Cleartext: $clearText'); // Hello!
}

密码哈希示例

以下是一个使用Argon2id进行密码哈希的示例:

import 'package:cryptography_plus/cryptography_plus.dart';

Future<void> main() async {
  final algorithm = Argon2id(
    memory: 10 * 1000, // 10 MB
    parallelism: 2, // 使用最多两个CPU核心
    iterations: 1, // 为了更高的安全性,通常应增加memory参数而不是iterations
    hashLength: 32, // 返回哈希的字节数
  );

  final secretKey = await algorithm.deriveKeyFromPassword(
    password: 'qwerty',
    nonce: [1, 2, 3],
  );
  final secretKeyBytes = await secretKey.extractBytes();

  print('Hash: ${secretKeyBytes}');
}

哈希示例

以下是一个使用Sha256进行哈希的示例:

import 'package:cryptography_plus/cryptography_plus.dart';

Future<void> main() async {
  final sink = Sha256().newHashSink();

  // 添加所有部分的认证消息
  sink.add([1, 2, 3]);
  sink.add([4, 5]);
  sink.add([6]);

  // 计算哈希
  sink.close();
  final hash = await sink.hash();

  print('SHA-256 hash: ${hash.bytes}');
}

通过这些示例,你可以更好地理解如何在Flutter应用中使用cryptography_plus包进行加密、解密和其他密码学操作。希望这些信息对你有帮助!如果有任何问题,请随时提问。


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

1 回复

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


当然,下面是一个关于如何使用Flutter中的cryptography_plus插件进行加密和解密的代码示例。这个插件提供了多种加密算法,包括AES、RSA等。以下示例将展示如何使用AES进行对称加密和解密。

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

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

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

接下来是一个简单的示例,展示如何使用AES进行加密和解密:

import 'package:flutter/material.dart';
import 'package:cryptography_plus/cryptography_plus.dart';
import 'dart:typed_data';
import 'dart:convert';

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

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

class _MyAppState extends State<MyApp> {
  String originalText = "Hello, Flutter!";
  String encryptedText = "";
  String decryptedText = "";

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

  Future<void> encryptAndDecrypt() async {
    // 生成一个随机的AES密钥
    final aesKey = await AesKey.generateSecureRandom(length: 32);
    final iv = await Iv.generateSecureRandom(length: 16); // 初始化向量

    // 加密
    final encrypter = AesEncrypter(AesGcm(aesKey));
    final encrypted = encrypter.encrypt(
      originalText.codeUnits,
      iv: iv,
    );
    setState(() {
      encryptedText = base64Encode(encrypted.bytes);
    });

    // 解密
    final decrypted = encrypter.decrypt(
      Encrypted(bytes: base64Decode(encryptedText), nonce: encrypted.nonce),
    );
    setState(() {
      decryptedText = String.fromCharCodes(decrypted);
    });

    print("Original Text: $originalText");
    print("Encrypted Text: $encryptedText");
    print("Decrypted Text: $decryptedText");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AES Encryption/Decryption Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text("Original Text: $originalText"),
              SizedBox(height: 16),
              Text("Encrypted Text: $encryptedText"),
              SizedBox(height: 16),
              Text("Decrypted Text: $decryptedText"),
            ],
          ),
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖添加:在pubspec.yaml中添加cryptography_plus依赖。
  2. 密钥和初始化向量生成:使用AesKey.generateSecureRandomIv.generateSecureRandom生成AES密钥和初始化向量。
  3. 加密:创建一个AesEncrypter实例,并使用encrypt方法对原始文本进行加密。加密结果包括密文和初始化向量(nonce)。
  4. 解密:使用相同的AesEncrypter实例和decrypt方法对加密结果进行解密。注意,解密时需要提供正确的密文和初始化向量。
  5. 显示结果:在Flutter应用中显示原始文本、加密文本和解密文本。

注意事项:

  • 在实际应用中,密钥管理非常重要,不应硬编码在代码中。
  • 加密和解密操作是异步的,因此使用了Futureasync/await
  • cryptography_plus插件可能还有其他高级用法和功能,请参考其官方文档获取更多信息。

希望这个示例能帮助你理解如何在Flutter中使用cryptography_plus插件进行加密和解密。

回到顶部