Flutter安全加密插件aes_crypt_null_safe的使用

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

Flutter安全加密插件aes_crypt_null_safe的使用

简介

aes_crypt_null_safe 是一个用于Dart和Flutter开发者的库,它使用256位AES算法来加密/解密文件、纯文本和二进制数据。该库完全兼容AES Crypt文件格式,并且可以在任何平台上使用,因为所有算法都是用纯Dart实现的。

特性

  • 支持256位AES加密格式。
  • 支持文件到文件的加密和解密。
  • 支持内存到文件的加密以及文件到内存的解密。
  • 密码支持Unicode字符(如"密码 パスワード пароль كلمة السر")。
  • 支持异步文件系统读写操作。
  • 加密后的文件具有.aes扩展名,其他操作系统上的客户端可以识别。
  • 提供适用于Windows、Linux、Mac OS、Android和iOS的兼容软件。

使用方法

1. 添加依赖

首先,在您的pubspec.yaml文件中添加依赖:

dependencies:
  aes_crypt_null_safe: ^1.0.0

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

2. 初始化

在您的Dart代码中添加以下导入:

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

设置密码

// 直接初始化并设置密码
var crypt = AesCrypt('my cool password');

// 或者分步设置
var crypt = AesCrypt();
crypt.setPassword('my cool password');

设置覆盖模式

// 覆盖已存在的文件
crypt.setOverwriteMode(AesCryptOwMode.on);

// 如果文件存在,则抛出异常
crypt.setOverwriteMode(AesCryptOwMode.warn);

// 如果文件存在,则重命名新文件(例如:添加(1), (2)等)
crypt.setOverwriteMode(AesCryptOwMode.rename);

3. 文件加密/解密示例

// 加密文件srcfile.txt并保存为srcfile.txt.aes
crypt.encryptFileSync('srcfile.txt');

// 加密文件srcfile.txt并保存为enc_file.txt.aes
crypt.encryptFileSync('srcfile.txt', 'enc_file.txt.aes');

// 解密文件srcfile.txt.aes并保存为srcfile.txt
crypt.decryptFileSync('srcfile.txt.aes');

// 解密文件srcfile.txt.aes并保存为dec_file.txt
crypt.decryptFileSync('srcfile.txt.aes', 'dec_file.txt');

4. 文本加密/解密示例

String decryptedText;

// 要加密的纯文本
String srcText = 'some text';

// 将UTF8编码的文本加密并保存为mytext.txt.aes
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes');

// 将UTF16 Big Endian编码的文本加密并保存为mytext.txt.aes
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes', utf16: true);

// 将UTF16 Little Endian编码的文本加密并保存为mytext.txt.aes
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes', utf16: true, endian: Endian.little);

// 解密文件并根据BOM自动选择编码
decryptedText = crypt.decryptTextFromFileSync('mytext.txt.aes');

// 强制以UTF16 Big Endian编码解密
decryptedText = crypt.decryptTextFromFileSync('mytext.txt.aes', utf16: true);

5. 二进制数据加密/解密示例

// 要加密的二进制数据
Uint8List srcData = Uint8List.fromList([1,2,3,4,5]);

// 加密数据并保存为mydata.bin.aes
crypt.encryptDataToFileSync(srcData, 'mydata.bin.aes');

// 解密数据
Uint8List decryptedData = crypt.decryptDataFromFileSync('mydata.bin.aes');

6. AES模式加密/解密示例

// 设置密钥和IV
Uint8List key = Uint8List.fromList([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
Uint8List iv = Uint8List.fromList([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
AesMode mode = AesMode.cbc;

// 设置密钥、IV和模式
crypt.aesSetKeys(key, iv);
crypt.aesSetMode(mode);

// 加密数据
Uint8List encryptedData = crypt.aesEncrypt(srcData);

// 解密数据
Uint8List decryptedData = crypt.aesDecrypt(encryptedData);

7. SHA256和HMAC-SHA256计算

// 源数据
Uint8List srcData = Uint8List.fromList([1,2,3,4,5,6,7,8,9]);

// 计算SHA256哈希值
Uint8List hash = crypt.sha256(srcData);

// HMAC密钥
Uint8List key = Uint8List.fromList([1,2,3]);

// 计算HMAC-SHA256
Uint8List hmac = crypt.hmacSha256(key, srcData);

以上就是aes_crypt_null_safe的基本使用方法。通过这个插件,您可以轻松地在Flutter应用中实现文件、文本和二进制数据的安全加密和解密功能。


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

1 回复

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


当然,以下是如何在Flutter项目中使用aes_crypt_null_safe插件进行AES加密和解密的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  aes_crypt_null_safe: ^1.0.0  # 请注意版本号,使用最新的稳定版本

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

以下是一个完整的示例,展示了如何使用aes_crypt_null_safe进行加密和解密:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AES Encryption Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: MyHomePage(),
        ),
      ),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _plainTextController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();
  String? _encryptedText;
  String? _decryptedText;

  void _encrypt() {
    final plainText = _plainTextController.text;
    final password = _passwordController.text;

    if (plainText.isEmpty || password.isEmpty) {
      return;
    }

    final key = AesCrypt.generateKeyFromPassword(password!, length: 32);
    final aes = AesCrypt(key);
    final encrypted = aes.encrypt(plainText);

    setState(() {
      _encryptedText = encrypted;
      _decryptedText = null;
    });
  }

  void _decrypt() {
    final encryptedText = _encryptedText ?? '';
    final password = _passwordController.text;

    if (encryptedText.isEmpty || password.isEmpty) {
      return;
    }

    final key = AesCrypt.generateKeyFromPassword(password!, length: 32);
    final aes = AesCrypt(key);
    final decrypted = aes.decrypt(encryptedText);

    setState(() {
      _decryptedText = decrypted;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        TextField(
          controller: _plainTextController,
          decoration: InputDecoration(labelText: 'Plain Text'),
          maxLines: 4,
        ),
        SizedBox(height: 16),
        TextField(
          controller: _passwordController,
          decoration: InputDecoration(labelText: 'Password'),
          obscureText: true,
        ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: _encrypt,
          child: Text('Encrypt'),
        ),
        SizedBox(height: 16),
        if (_encryptedText != null)
          Text(
            'Encrypted Text: $_encryptedText',
            style: TextStyle(color: Colors.blue),
          ),
        SizedBox(height: 16),
        if (_decryptedText != null)
          Text(
            'Decrypted Text: $_decryptedText',
            style: TextStyle(color: Colors.green),
          ),
        SizedBox(height: 16),
        if (_encryptedText != null)
          ElevatedButton(
            onPressed: _decrypt,
            child: Text('Decrypt'),
          ),
      ],
    );
  }
}

// Helper function to make Column a widget that can be used directly in Scaffold's body
Widget Column({required List<Widget> children, CrossAxisAlignment? crossAxisAlignment}) {
  return Center(
    child: Container(
      constraints: BoxConstraints(maxWidth: 600),
      child: Column(
        crossAxisAlignment: crossAxisAlignment ?? CrossAxisAlignment.center,
        children: children,
      ),
    ),
  );
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含两个TextField用于输入明文和密码,以及两个ElevatedButton用于触发加密和解密操作。加密后的文本和解密后的文本分别显示在页面上。

注意事项

  1. 密码安全:在实际应用中,密码存储和传输需要非常小心,不应以明文形式出现在客户端代码中。
  2. 密钥管理:生成和使用密钥应遵守最佳安全实践。
  3. 错误处理:在实际应用中,应该添加错误处理逻辑,例如捕获和显示加密/解密过程中可能出现的异常。

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

回到顶部