[英]How to decrypt audio file in the form of stream in Flutter/Dart?
项目要求:音乐播放器应用程序,它将下载音频文件,加密并保存它们。 音频文件应该只能在应用程序中播放。 没有其他应用程序应该能够播放这些文件。 用户也不应该能够复制文件。
方法:我不希望整个解密的音频文件在任何时候都存在。 所以我想在下载音频文件后立即对其进行加密。 然后当文件要播放时,我希望它被逐块解密并播放。 我相信这可以通过使用 stream 来实现。据我搜索,名为“just_audio”的 package 可以播放来自 stream 源的音频。
问题:我找不到任何用于 Flutter/Dart 的加密 package,它会以 stream 的形式解密数据 output。这是我第一次尝试实现加密/解密,所以我在这方面的知识很差。
笔记:
选项:
首先,要加密或解密数据,请查看https:\/\/pub.dev\/packages\/cryptography<\/a>或https:\/\/pub.dev\/packages\/encrypt<\/a>或类似的东西。
其次,既然要查找,使用流可能不是最优的解决方案——“流”抽象更像是一个数据序列,而不是到处乱跳(查找)。 相反,将整个音频(比如 1 小时)分成多个块(比如 1 分钟),然后在不使用流的情况下单独上传\/加密\/解密\/下载每个块。 如果你的块足够小,下载\/解密一个块会很快,而且你不会卡住 UI。 如果解密仍然太慢,请查看isolates<\/em> ,它们是 Flutter 中的“线程”。 在单独的隔离中运行解密,然后您的 UI 将是平滑的。
我需要音乐播放器的所有常用功能(例如专辑、播放列表、具有搜索功能的进度条等)
如果您对第 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.