繁体   English   中英

如何在Flutter/Dart中解密stream格式的音频文件?

[英]How to decrypt audio file in the form of stream in Flutter/Dart?

项目要求:音乐播放器应用程序,它将下载音频文件,加密并保存它们。 音频文件应该只能在应用程序中播放。 没有其他应用程序应该能够播放这些文件。 用户也不应该能够复制文件。

方法:我不希望整个解密的音频文件在任何时候都存在。 所以我想在下载音频文件后立即对其进行加密。 然后当文件要播放时,我希望它被逐块解密并播放。 我相信这可以通过使用 stream 来实现。据我搜索,名为“just_audio”的 package 可以播放来自 stream 源的音频。

问题:我找不到任何用于 Flutter/Dart 的加密 package,它会以 stream 的形式解密数据 output。这是我第一次尝试实现加密/解密,所以我在这方面的知识很差。

笔记:

  1. 加密不需要很重。 不能复制文件并在别处播放的典型用户就足够了。
  2. 音频文件会很大,有些甚至长达数小时。
  3. 我需要音乐播放器的所有常用功能(例如专辑、播放列表、进度条和搜索 function 等)

选项:

  1. 如果有现成的 package 可以满足我的需要,那将是最好的。
  2. 找到一个基本的 package,然后将其修改为执行所需的操作。
  3. 一些完全不同的解决方案,采用完全不同的路径但提供所有解决方案。

首先,要加密或解密数据,请查看https:\/\/pub.dev\/packages\/cryptography<\/a>或https:\/\/pub.dev\/packages\/encrypt<\/a>或类似的东西。

其次,既然要查找,使用流可能不是最优的解决方案——“流”抽象更像是一个数据序列,而不是到处乱跳(查找)。 相反,将整个音频(比如 1 小时)分成多个块(比如 1 分钟),然后在不使用流的情况下单独上传\/加密\/解密\/下载每个块。 如果你的块足够小,下载\/解密一个块会很快,而且你不会卡住 UI。 如果解密仍然太慢,请查看isolates<\/em> ,它们是 Flutter 中的“线程”。 在单独的隔离中运行解密,然后您的 UI 将是平滑的。

我需要音乐播放器的所有常用功能(例如专辑、播放列表、具有搜索功能的进度条等)

搜索在上面实现。 对于专辑\/播放列表,你可以在 Flutter 中修改任何普通的音频播放器来实现,或者直接自己实现。 它更像是一些 UI 的东西,没有什么特别的东西,任何熟悉 Flutter 的人都可以编写,不用担心。

如果您对第 3 个 package 持开放态度,请不要重新发明轮子。

在这里尝试使用各种 CipherStream 选项https://morioh.com/p/34a06006b299

如果您可以放弃 stream 加密并在获得文件后执行此操作,请尝试使用此package ,信用证:我使用了Hoaea Varghese 的此答案中的示例

使用 AES,您所需要的只是文件的路径,您可以使用如下简单的方式加密文件或相册

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

使用下面的代码

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;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM