如何使用 Flutter 和 Dart 执行文件加密

Posted

技术标签:

【中文标题】如何使用 Flutter 和 Dart 执行文件加密【英文标题】:How to Perform File encryption with Flutter and Dart 【发布时间】:2019-10-10 14:08:52 【问题描述】:

我不知道在这里问我的问题是否合适。我只需要对我正在尝试构建的应用程序进行可行性研究。我选择 Flutter 是因为我可以快速创建移动应用。

我的应用程序将以音频文件的形式存储语音消息。它可以是 mp3 或音频格式。

为了使它只能被接收者读取,我需要使用 AES 或 e2e 加密来加密文件。

我需要知道是否可以在我的 Flutter 应用中使用 Dart 加密文件。如果可以的话,我想获得有用的资源。

我试图搜索这个主题,但我只能找到关于加密字符串或文本文件的文章。

【问题讨论】:

您可以使用 Dart 加密文件。文件只是一个字节序列,这正是流密码和块密码的工作原理。 (分组密码必须在“模式”中使用:例如,CTR、GCM、CCM 等)密码系统的设计(密钥管理、密钥材料推导等)不在 SO 问题的范围内,但是. pub.dev/packages/encrypt 推荐 PointyCastle(BouncyCastle 的一个端口)可能更好,它在 UInt8List 上运行,即字节数组。但是,您可能需要考虑为此特定部分使用本机/Java 代码,因为加密可能没有您期望的那么快。即便如此,您当然也可以先尝试 Dart。 【参考方案1】:

终于找到东西了。我尝试了多种选择,包括加密包,但都是死胡同。我终于找到了this package 它可以使用 AES 加密文件,您所需要的只是文件的路径。这是有据可查的。我相信最好创建一个类并添加加密和解密函数,如下所示。

import 'dart:io';
import 'package:aes_crypt/aes_crypt.dart';

class EncryptData 
  static String encrypt_file(String path) 
    AesCrypt crypt = AesCrypt();
    crypt.setOverwriteMode(AesCryptOwMode.on);
    crypt.setPassword('my cool password');
    String encFilepath;
    try 
      encFilepath = crypt.encryptFileSync(path);
      print('The encryption has been completed successfully.');
      print('Encrypted file: $encFilepath');
     catch (e) 
      if (e.type == AesCryptExceptionType.destFileExists) 
        print('The encryption has been completed unsuccessfully.');
        print(e.message);
      
      else
        return 'ERROR';
      
    
    return encFilepath;
  

  static String decrypt_file(String path) 
    AesCrypt crypt = AesCrypt();
    crypt.setOverwriteMode(AesCryptOwMode.on);
    crypt.setPassword('my cool password');
    String decFilepath;
    try 
      decFilepath = crypt.decryptFileSync(path);
      print('The decryption has been completed successfully.');
      print('Decrypted file 1: $decFilepath');
      print('File content: ' + File(decFilepath).path);
     catch (e) 
      if (e.type == AesCryptExceptionType.destFileExists) 
        print('The decryption has been completed unsuccessfully.');
        print(e.message);
      
      else
        return 'ERROR';
      
    
    return decFilepath;
  



现在你可以像这样使用它了

encrypted_file_path = EncryptData.encrypt_file('your/file/path');

【讨论】:

我并没有真正从包描述中得到,这个 Flutter 库是否可以在任何设备上独立运行,还是必须安装单独的加密应用程序? 使用此技术,您需要将解密后的文件存储在内存中。这将允许任何人复制它,或使用其他音乐播放器阅读。我正在寻找一种逐字节解密并在我的媒体播放器上随时随地阅读的方法

以上是关于如何使用 Flutter 和 Dart 执行文件加密的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的简单.dart文件创建插件以在Flutter中使用?

如何使用flutter dart webview渲染本地HTML文件

如何在flutter中导入和使用另一个dart文件中的函数

如何获取音频文件的长度而不在 Flutter/Dart 中播放

为啥在 dart/flutter 中不等待 await 返回就执行代码?

使用 dart:HTML 库在 Flutter Web 中选择文件时如何获取 Flutter 中的文件名?