Flutter文件加密加载插件encrypt_file_loader的使用

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

Flutter文件加密加载插件encrypt_file_loader的使用

encrypt_file_loader 是一个用于下载并保存加密文件的Flutter插件。它可以在加载文件后设置密钥并解密文件。

使用方法

1 webcrypto

  • 解密使用 webcrypto
  • 数据库由 drift 创建。 如果您想要使用Web支持,请参阅以下链接:drift web doc

Web

  • 如果要在Web上运行,需要阅读 drift web doc。 特别是在使用wasm时,请参考 Getting started
  • 示例目录中有在Web上工作的示例。

示例代码

import 'dart:convert';
import 'dart:typed_data';

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({required this.title});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _db = EncryptFileLoader();
  String _result = 'no loaded data';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(_result),
            ElevatedButton(
              onPressed: () async {
                final value = await _db.loadAndDecrypt(
                  url:
                      'https://raw.githubusercontent.com/koji-109/encrypt_file_loader/main/fixture/plain.json',
                  type: const TypePlain(),
                  responseType: ResponseType.bodyBytes,
                );

                setState(() {
                  _result = switch (value) {
                    LoaderSuccess(
                      data: final data,
                    ) =&gt;
                      utf8.decode(data),
                    _ =&gt; 'no loaded data',
                  };
                });
              },
              child: const Text('load plain text'),
            ),
            ElevatedButton(
              onPressed: () async {
                final key = await AesCbcSecretKey.importRawKey([
                  169,
                  153,
                  153,
                  89,
                  151,
                  174,
                  104,
                  213,
                  193,
                  185,
                  118,
                  112,
                  123,
                  39,
                  157,
                  141,
                ]);
                final iv = Uint8List.fromList(
                  [
                    205,
                    108,
                    3,
                    111,
                    125,
                    147,
                    153,
                    175,
                    228,
                    101,
                    195,
                    225,
                    18,
                    252,
                    192,
                    222,
                  ],
                );

                final value = await _db.loadAndDecrypt(
                  url:
                      'https://raw.githubusercontent.com/koji-1 09/encrypt_file_loader/main/fixture/aes_cbc.json',
                  type: TypeAesCbc(
                    key: key,
                    iv: iv,
                  ),
                  responseType: ResponseType.bodyText,
                );

                setState(() {
                  _result = switch (value) {
                    LoaderSuccess(
                      data: final data,
                    ) =&gt;
                      utf8.decode(data),
                    _ =&gt; 'no loaded data',
                  };
                });
              },
              child: const Text('load aes cbc'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用encrypt_file_loader插件来加密和解密文件的示例代码。encrypt_file_loader是一个假设的插件名称,因为实际上并没有一个广泛知名的Flutter插件直接叫做这个名字。不过,基于你的要求,我将展示一个类似的文件加密和解密流程,你可以根据实际需要调整代码来适配任何类似的插件。

首先,你需要确保在pubspec.yaml文件中添加了加密相关的依赖,例如encryptpointycastle(如果encrypt_file_loader插件存在,也应该在这里添加)。但这里我们假设没有直接的encrypt_file_loader插件,而是使用encrypt库作为示例。

dependencies:
  flutter:
    sdk: flutter
  encrypt: ^5.0.1  # 假设的版本号,请检查最新版本
  pointycastle: ^3.0.1  # 加密库依赖的pointycastle

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

接下来,在你的Flutter项目中,你可以使用以下代码来加密和解密文件内容:

import 'dart:io';
import 'dart:convert';
import 'package:encrypt/encrypt.dart';

class FileEncryptor {
  final String key;
  final IV iv;

  FileEncryptor({required this.key}) : iv = IV.fromLength(16); // 16 bytes IV for AES

  String encryptFile(File file) {
    // 读取文件内容
    List<int> fileContent = file.readAsBytesSync();
    String plainText = utf8.decode(fileContent);

    // 设置加密密钥和IV
    final keyS = Key.fromUtf8(key);
    final encrypter = Encrypter(AES(keyS));

    // 加密
    final encrypted = encrypter.encrypt(plainText, iv: iv);

    // 返回Base64编码的加密字符串
    return base64Encode(encrypted.bytes);
  }

  void decryptFile(String encryptedBase64, File outputFile) {
    // 解码Base64加密字符串
    List<int> encryptedBytes = base64Decode(encryptedBase64);

    // 设置加密密钥和IV
    final keyS = Key.fromUtf8(key);
    final encrypter = Encrypter(AES(keyS));

    // 解密
    final decrypted = encrypter.decrypt64(encryptedBase64, iv: iv);

    // 将解密后的内容写入文件
    outputFile.writeAsStringSync(decrypted);
  }
}

void main() {
  // 示例密钥(在实际应用中,应该使用安全的密钥管理方式)
  String secretKey = 'your-secret-256-bit-key-here32characters';

  // 创建文件加密器实例
  FileEncryptor fileEncryptor = FileEncryptor(key: secretKey);

  // 加密文件
  File inputFile = File('example.txt'); // 替换为你的输入文件路径
  String encryptedContent = fileEncryptor.encryptFile(inputFile);
  print('Encrypted content: $encryptedContent');

  // 解密文件
  File outputFile = File('decrypted_example.txt'); // 替换为你的输出文件路径
  fileEncryptor.decryptFile(encryptedContent, outputFile);
  print('File decrypted and saved to $outputFile');
}

注意

  1. 上面的代码示例使用了AES加密,并且密钥长度应该是256位(32个字符)。在实际应用中,密钥管理应该更加安全。
  2. IV(初始化向量)在加密过程中非常重要,通常与密钥一起使用以确保加密的安全性。上面的示例中,IV是随机生成的,但在实际应用中,你可能需要更复杂的IV管理策略。
  3. 加密和解密函数中的文件读取和写入是同步进行的,对于大文件或需要更高效处理的场景,可以考虑使用异步方法。
  4. 示例中的密钥和IV管理是非常基本的,实际应用中应该使用更安全的方法,比如从安全的密钥存储中获取密钥,以及为每个加密操作生成唯一的IV。

如果你有一个具体的encrypt_file_loader插件,并且它有特定的API,那么你应该参考该插件的文档来调整上述代码。上述代码提供了一个基础的加密和解密流程,你可以根据插件的API进行相应的调整。

回到顶部