Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用NaCl实现可查找的媒体输入流进行解密_Android_Encryption_Streaming_Libsodium - Fatal编程技术网

Android 如何使用NaCl实现可查找的媒体输入流进行解密

Android 如何使用NaCl实现可查找的媒体输入流进行解密,android,encryption,streaming,libsodium,Android,Encryption,Streaming,Libsodium,我们有一个由文档和媒体文件组成的产品,这些文件经过加密以保护DRM。在生产端,我们有一个加密文件的Python脚本,在客户端,有一个解密文件的Android应用程序。这意味着我们需要一个加密/解密方案,可以在Python和Android平台上兼容工作。我选择了libnail/NaCl,因为它在上可用,是免费的,开源的,并且它设计了高级API,应该提供“默认原语的专家选择”(Expert selection of default primitives)),从而帮助开发人员正确配置,而不必是密码参数

我们有一个由文档和媒体文件组成的产品,这些文件经过加密以保护DRM。在生产端,我们有一个加密文件的Python脚本,在客户端,有一个解密文件的Android应用程序。这意味着我们需要一个加密/解密方案,可以在Python和Android平台上兼容工作。我选择了libnail/NaCl,因为它在上可用,是免费的,开源的,并且它设计了高级API,应该提供“默认原语的专家选择”(Expert selection of default primitives)),从而帮助开发人员正确配置,而不必是密码参数细节方面的专家

基于这一点,我已经成功地测试了在Python上用NaCl加密的数据可以在Android上用NaCl解密。在钠方面投入了相当多的学习时间,所以如果可能的话,我不想改变这一点

然而,在Android端播放受DRM保护的大型视频时,我认为我们需要一个能够用于流媒体的解决方案,而不仅仅是将整个文件解密到内存中。目前,我们正在将整个文件读入内存并解密:

final byte[] plainBytes = secretBox.decrypt(nonce, cipherText);
显然,对于大的视频文件来说,这不太好用。如果我们使用javax.crypto.Cipher而不是Na钠,我们可以使用它来实现CipherInputStream(并使用它来实现exoplayer2.upstream.DataSource或其他东西)。但是我很难看到如何使用libnaid实现解密流

我用来“流”函数的libnaudio库。但“流”的这个含义似乎与Java InputStream意义上的“流”有些不同。此外,所有这些函数似乎都非常特定于低级别的详细参数,到目前为止,libnaudio还没有要求我知道这些参数。例如,
chacha20
salsa20
xsalsa20
xchacha20poly1305
,等等。到目前为止,我不知道这两种算法中的哪一种在任何一方使用;秘密箱刚刚工作

所以我想我最想回答的问题是,如何在Android中使用LibNasdaq来提供可查找的流式解密?你知道有什么好的示例代码吗

其中的子问题:

  • 诚然,现在我仔细查看文档,我看到了pynacl SecretBox流密码。我不知道我是否能一直相信这一点,因为我应该远离那些细节
  • 我认为,对于媒体播放,你需要的不仅仅是流媒体,也就是说,你可以一次按顺序消费一小块。对于典型用法,您还需要它是可查找的:用户希望能够向后跳5秒,而不必等待播放器重置到流的开头,并在5秒之前再次处理/解密整个内容
  • 我是否可以在Android端使用javax.crypto.Cipher,但将其配置为与加密算法(XSalsa20)及其PyNaCl SecretBox生产过程中的参数兼容
更新: 澄清一下,

  • 解密密钥传递的问题已经得到了满意的解决,所以这不是我在这里寻求帮助的原因
  • 我们的应用程序完全离线,所以我提到的流媒体问题与从本地存储加载和解密文件有关,而不是等待下载

对于视频,您可能更容易使用现有机制,因为它们已经解决了您的大部分问题

对于大多数视频应用程序,您将希望流式传输视频并边走边播放/搜索,而不是像您指出的那样下载整个视频

目前,有三种主要的DRM常用于在服务器和客户端之间加密和共享密钥:Widevine、PlayReady和FairPlay。这三项功能都将支持您想要的流式视频功能。缺点是使用这些DRM服务通常需要付费

您还可以使用HLS或DASH流式传输视频、可调比特率或ABR流式传输协议()

这些允许您使用不太安全但可能足以满足您需求的密钥共享机制,这些机制基本上允许在内容本身仍然加密的情况下以明文形式共享密钥。这些都是免费的,并且得到了很好的支持:

  • HLS AES加密
  • 破折号密钥加密
查看这些答案,以获取生成两个流的示例:

您可以使用开放源代码播放器播放流,如浏览器的DASH.JS和Android Native的ExoPlayer

如果您想要更高的安全性,但仍然希望避免使用商业DRM,您还可以修改上述内容,直接在您的player客户端上配置密钥,而不是将密钥从服务器传输到客户端

然后,你确实有可能被黑客或反向工程你的客户端应用程序来提取密钥,但我认为你还是会用你最初的方法来实现这一点。DRM系统的真正价值不是内容加密(本质上只是AES),而是它们用于安全传输和存储密钥的机制。归根结底,这是一个成本和收益的问题——听起来您的解决方案可以与自定义配置的密钥实现充分配合

另一方面,关于寻找问题-大多数视频格式被分成图片或帧组,这些图片或帧可以在一些标题信息的帮助下,在前后独立于视频的其余部分进行解码。因此,您可以在任意给定点解码,或者至少在任意给定点附近解码,而不必解码到该点的整个视频

在播放器上沿时间轴滚动或悬停时看到的缩略图通常是单独的静态图像快照流