Flutter加密解密插件crypto_dart的使用

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

Flutter 加密解密插件 crypto_dart 的使用

欢迎使用 Dart Crypto 插件!此插件旨在为 Dart 开发者提供类似于 CryptoJS 的加密功能。通过此插件,你可以在 Dart 应用程序中执行各种加密操作,包括加密、解密、哈希等。

功能特性

  • 加密/解密:使用流行的算法(如 AES、Triple DES)对数据进行加密和解密。
  • 哈希:使用 MD5、SHA-1、SHA-256、SHA-512 等算法生成数据的哈希值。
  • 编码/解码:使用 Base64、Hex、Utf8 等编码格式对数据进行编码和解码。

安装

你可以通过 pub.dev 在 pubspec.yaml 文件中添加依赖来安装此插件:

dependencies:
  crypto_dart: ^1.0.3+1

然后运行 pub get 来获取插件。

使用示例

以下是一个快速示例,演示如何使用此插件提供的部分功能:

import 'package:crypto_dart/crypto_dart.dart';

void main() {
  // 使用 AES 加密和解密数据
  final key = 'ThisIsASecretKey';
  final plainText = 'Hello, World!';
  final encryptedText = CryptoDart.AES.encrypt(plainText, key);
  final decryptedText = CryptoDart.AES.decrypt(encryptedText, key);
  print('Encrypted Text: $encryptedText');
  print('Decrypted Text: $decryptedText');

  // 生成 SHA-256 哈希值
  final dataToHash = 'SensitiveData';
  final hashValue = CryptoDart.SHA256(dataToHash);
  print('SHA-256 Hash: $hashValue');
}

贡献

欢迎对本插件进行贡献!如果你发现任何错误、希望请求新功能或希望贡献代码,请在 GitHub 仓库上打开一个 issue 或提交 pull request:[https://github.com/Noobware1/crypto_dart]。

许可证

此插件根据 MIT 许可证分发。详情请参阅 LICENSE 文件。

致谢

此插件受 CryptoJS 启发,并旨在为 Dart 开发者提供类似的功能。感谢 Dart 社区的支持和贡献。

对于更详细的文档和使用示例,请参阅包文档。

如果你有任何问题或需要进一步的帮助,请联系包维护者或在 GitHub 仓库上打开 issue。

祝你编程愉快!🚀


完整示例 Demo

以下是完整的示例代码,展示了如何使用 crypto_dart 包进行哈希计算:

import 'package:crypto_dart/crypto_dart.dart';
import 'package:crypto_dart/hashers.dart';

void main(List<String> args) {
  // 两种使用此库的方法
  // 1. 使用静态方法
  var ciphertext = CryptoDart.MD5('my message').toString();
  print(ciphertext);

  // 2. 创建实例
  ciphertext = MD5('my message').toString();
  print(ciphertext);
}

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

1 回复

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


当然,以下是一个使用 crypto_dart 插件在 Flutter 中进行加密和解密的示例代码。crypto_dart 是一个用于在 Dart 中进行加密和解密操作的库,适用于 Flutter 应用。

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

dependencies:
  flutter:
    sdk: flutter
  crypto_dart: ^3.0.0  # 请确保使用最新版本

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

接下来,在你的 Flutter 项目中,你可以使用以下代码进行加密和解密操作。这里我们使用 AES 对称加密算法进行示例:

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

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

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

class CryptoDartExample extends StatefulWidget {
  @override
  _CryptoDartExampleState createState() => _CryptoDartExampleState();
}

class _CryptoDartExampleState extends State<CryptoDartExample> {
  final TextEditingController _plainTextController = TextEditingController();
  final TextEditingController _encryptedTextController = TextEditingController();
  final TextEditingController _decryptedTextController = TextEditingController();
  final TextEditingController _keyController = TextEditingController(text: '1234567890123456'); // 16-byte key for AES-128

  String? _encryptedText;
  String? _decryptedText;

  void _encrypt() {
    final plainText = _plainTextController.text;
    final key = Uint8List.fromList(_keyController.text.codeUnits);

    try {
      final aes = Aes.CBC(key);
      final iv = aes.randomIV(); // Initialization vector
      final encrypted = aes.encrypt(plainText, iv: iv);
      
      // Base64 encode the encrypted text and IV for easy storage/transmission
      final encryptedBase64 = base64.encode(encrypted.bytes + iv);
      
      setState(() {
        _encryptedText = encryptedBase64;
      });
    } catch (e) {
      print('Encryption error: $e');
    }
  }

  void _decrypt() {
    final encryptedBase64 = _encryptedTextController.text;
    final key = Uint8List.fromList(_keyController.text.codeUnits);

    try {
      // Base64 decode the encrypted text and IV
      final encryptedWithIv = base64.decode(encryptedBase64!);
      final encryptedBytes = encryptedWithIv.sublist(0, encryptedWithIv.length - 16); // AES block size is 16 bytes
      final iv = encryptedWithIv.sublist(encryptedBytes.length);

      final aes = Aes.CBC(key);
      final decrypted = aes.decrypt(encryptedBytes, iv: iv);

      setState(() {
        _decryptedText = decrypted;
      });
    } catch (e) {
      print('Decryption error: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        TextField(
          controller: _plainTextController,
          decoration: InputDecoration(labelText: 'Plain Text'),
          maxLines: 5,
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _encrypt,
          child: Text('Encrypt'),
        ),
        SizedBox(height: 20),
        TextField(
          controller: _encryptedTextController,
          decoration: InputDecoration(labelText: 'Encrypted Text'),
          readOnly: true,
          maxLines: 5,
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _decrypt,
          child: Text('Decrypt'),
        ),
        SizedBox(height: 20),
        TextField(
          controller: _decryptedTextController,
          decoration: InputDecoration(labelText: 'Decrypted Text'),
          readOnly: true,
          maxLines: 5,
        ),
        SizedBox(height: 20),
        TextField(
          controller: _keyController,
          decoration: InputDecoration(labelText: 'Encryption Key (16 bytes)'),
          maxLength: 16,
        ),
      ],
    );
  }
}

在这个示例中,我们展示了如何使用 AES-CBC 模式进行加密和解密。请注意以下几点:

  1. 密钥管理:在实际应用中,密钥的管理非常重要。这里我们直接在 UI 中显示和输入密钥,这是不安全的。实际应用中应该使用安全的密钥管理方式,如 Keystore(在 Android 上)或 Keychain(在 iOS 上)。

  2. 初始化向量(IV):IV 在每次加密时应该是随机的,并且与密文一起存储或传输。这里我们简单地将其附加在密文后面进行 Base64 编码。

  3. Base64 编码:为了方便存储和传输,加密后的字节数组被转换为 Base64 编码的字符串。

  4. 错误处理:示例中包含了简单的错误处理,但在实际应用中,你应该更详细地处理各种可能的异常。

这个示例应该能帮助你开始使用 crypto_dart 进行基本的加密和解密操作。如果你有更具体的需求,可能需要进一步定制这个代码。

回到顶部