Flutter加密解密插件cryptology的使用

Flutter 加密解密插件 cryptology 的使用

Cryptology 是一个用于在 Dart 和 Flutter 中使用 Pointycastle 库进行密码学操作的库。该库提供了密码加密和数据加密功能。

开始使用

要在项目中使用 cryptology 插件,请将其添加到 pubspec.yaml 文件中:

flutter pub add cryptology

密码加密与验证

PasswordEncryption 使用 PBKDF2 算法对密码进行哈希处理。

PBKDF2 如何工作?

PBKDF2 接收输入参数包括密码、盐值、定义要执行的散列函数迭代次数的整数,以及描述输出所需密钥长度的整数。

初始化 PasswordEncryption

要初始化 PasswordEncryption 对象:

final passwordEncryption = PasswordEncryption.initial(difficulty: HashDifficulty.strong); 

哈希密码

然后可以对密码进行哈希处理:

final hashedPwd = passwordEncryption.hash("pa$$w0rd");  // 哈希密码
// 如果你需要 Base64 编码的密码,可以使用 hashB64 方法。
final b64StringHashedPwd = passwordEncryption.hashB64("pa$$w0rd");

验证哈希密码

要验证哈希后的密码:

final isValid = passwordEncryption.verify("pa$$w0rd", hashedPwd);  // 验证密码
// 如果你有 Base64 编码的密码,可以使用 verifyB64 方法。
final isValidB64 = passwordEncryption.verifyB64("pa$$w0rd", b64StringHashedPwd);

数据加密

DataEncryption 使用 AES 算法对数据进行加密。

AES 如何工作?

高级加密标准(AES)通过将明文或二进制数据转换为看似随机字符组成的密文来工作。只有拥有特殊密钥的人才能解密它。AES 使用对称密钥加密,即只使用一个秘密密钥来加密和解密信息。

初始化 DataEncryption

要初始化 DataEncryption 对象:

final DataEncryption dataEncryption = DataEncryption.initial(
      secretKey: '1a2b3c4d', mode: AESMode.cbc, iv: 'q1w2e3r4');
  • 提供至少 8 个字符但最多 32 个字符的秘密密钥。
  • 提供模式,如 cbc, cfb, ofb, gcm
  • 提供初始向量(IV),至少 8 个字符但最多 16 个字符(如果未提供 IV,则使用密钥的反转作为 IV)。

加密数据

要加密数据,需要将数据转换为字节数组。

对于纯文本数据:
final plainText = "plain text data";
final Uint8List dataAsBytes = CryptoHelpers.toBytes(plainText);
// 或者使用扩展方法:
final Uint8List dataAsBytes = plainText.toBytes();
对于文件数据:
final fileData = await File("~/Pictures/my_profile.png").readAsBytes();

加密字节数组

final encryptedData = await dataEncryption.encrypt(fileData);  // 加密数据
// 对于 Base64 字符串编码:
final encryptedData = await dataEncryption.encryptB64(fileData);

解密数据

要解密加密的数据,可以使用以下方法:

final decryptedData = await dataEncryption.decrypt(encryptedData);  // 解密数据
// 如果你的加密数据是 Base64 编码的,可以使用 decryptB64 方法:
final decryptedData = await dataEncryption.decryptB64(encryptedData);

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

1 回复

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


当然,以下是如何在Flutter应用中使用cryptology插件进行加密和解密的示例代码。cryptology插件提供了对多种加密算法的支持,这里我们以AES加密为例。

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

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

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

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

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Cryptology Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _plainTextController = TextEditingController();
  final TextEditingController _encryptedTextController = TextEditingController();
  final TextEditingController _decryptedTextController = TextEditingController();
  final TextEditingController _keyController = TextEditingController();

  String? _encryptError;
  String? _decryptError;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Cryptology Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _keyController,
              decoration: InputDecoration(labelText: 'Encryption Key'),
            ),
            SizedBox(height: 16),
            TextField(
              controller: _plainTextController,
              decoration: InputDecoration(labelText: 'Plain Text'),
              maxLines: 5,
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _encrypt,
              child: Text('Encrypt'),
            ),
            SizedBox(height: 16),
            TextField(
              controller: _encryptedTextController,
              decoration: InputDecoration(labelText: 'Encrypted Text'),
              readOnly: true,
              maxLines: 5,
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _decrypt,
              child: Text('Decrypt'),
            ),
            SizedBox(height: 16),
            TextField(
              controller: _decryptedTextController,
              decoration: InputDecoration(labelText: 'Decrypted Text'),
              readOnly: true,
              maxLines: 5,
            ),
            SizedBox(height: 16),
            if (_encryptError != null)
              Text(
                'Encrypt Error: $_encryptError',
                style: TextStyle(color: Colors.red),
              ),
            if (_decryptError != null)
              Text(
                'Decrypt Error: $_decryptError',
                style: TextStyle(color: Colors.red),
              ),
          ],
        ),
      ),
    );
  }

  Future<void> _encrypt() async {
    setState(() {
      _encryptedTextController.clear();
      _encryptError = null;
    });

    final String? key = _keyController.text;
    final String? plainText = _plainTextController.text;

    if (key == null || plainText == null) {
      setState(() {
        _encryptError = 'Key and plain text are required.';
      });
      return;
    }

    try {
      final aes = AesCbcWithPkcs7Padding();
      final encrypted = await aes.encrypt(plainText, key: key);
      _encryptedTextController.text = encrypted.base64;
    } catch (e) {
      setState(() {
        _encryptError = e.toString();
      });
    }
  }

  Future<void> _decrypt() async {
    setState(() {
      _decryptedTextController.clear();
      _decryptError = null;
    });

    final String? key = _keyController.text;
    final String? encryptedTextBase64 = _encryptedTextController.text;

    if (key == null || encryptedTextBase64 == null) {
      setState(() {
        _decryptError = 'Key and encrypted text are required.';
      });
      return;
    }

    try {
      final aes = AesCbcWithPkcs7Padding();
      final encrypted = Encrypted.fromBase64(encryptedTextBase64);
      final decrypted = await aes.decrypt(encrypted, key: key);
      _decryptedTextController.text = decrypted;
    } catch (e) {
      setState(() {
        _decryptError = e.toString();
      });
    }
  }
}

解释

  1. 依赖添加:在pubspec.yaml文件中添加cryptology依赖。
  2. UI布局:使用TextFieldElevatedButton构建了一个简单的UI,允许用户输入密钥、明文、查看加密后的文本以及解密后的文本。
  3. 加密函数_encrypt函数使用AES-CBC-PKCS7填充模式进行加密。用户输入密钥和明文后,点击“Encrypt”按钮,加密后的文本将以Base64格式显示。
  4. 解密函数_decrypt函数使用AES-CBC-PKCS7填充模式进行解密。用户输入密钥和加密后的Base64文本后,点击“Decrypt”按钮,解密后的明文将显示。

注意:AES加密需要一个密钥,密钥的长度和格式取决于具体的算法实现。在实际应用中,密钥管理非常重要,应该妥善保管。

希望这个示例代码对你有所帮助!

回到顶部