我正在实现一个必须播放加密视频文件的视频播放器.该文件必须在运行时在缓冲区(例如ByteArrayOutputStream)中解密,然后该流必须被馈送到视频播放器中才能播放电影.
大多数人建议在本地托管流服务器实例,并将URL提供给播放器.但是这种方法安全吗?如果有人使用网络探查器应用程序(例如Windows的Fiddler)并捕获所有本地网络呼叫怎么办.用户将能够在流传输服务器和播放器之间流动时获得解密的字节,并将其本地保存在文件中
解决方法:
假设您要使用android.media.MediaPlayer来完成任务.
然后查看MediaPlayer.setDataSource您具有哪些选项:
>字符串路径(文件)
> Uri uri(http://或content://方案)
> FileDescriptor fd
1)Java File对您没有帮助.
2)具有http://的Uri是您提到的localhost上的流服务器.我测试了在我的应用程序中播放此类文件并使用适用于Android的WireShark捕获网络流量的情况,但未捕获任何内容,可能是因为无法捕获本地主机上的流量.因此,这对于通过本地http服务器流式传输来说足够安全.
3)具有content://方案的Uri从ContentProvider获取数据,ContentProvider可能是您自己的未导出提供程序,在其中您实现openAssetFile,并使用ParcelFileDescriptor.createPipe()和一个线程,在其中读取/解密数据并将其写入到达您在openAssetFile上返回的AssetFileDescriptor的管道.
这也是安全的选项,因为不会导出ContentProvider.
因此,您可以决定2)或3)中的哪一个更容易实现.