Android加密音频播放器

时间:2017-02-01 13:12:03

标签: java android audio encryption

我如何在音频播放器Android应用中播放一组加密音频文件?

我有一个应用项目,我会在用户设备上存储一组加密的音频内容。在这种情况下,单个音频内容(例如:播客)将包含多个加密文件。该应用程序充当音频播放器,用户通过该播放器收听此音频内容。 为了获得良好的用户体验,整个内容(播客)应该从一个文件无缝播放到另一个文件。这适用于使用Android的MediaPlayer类的普通音频文件。

对于安全措施,用户设备存储上不应存在任何解密文件,用户可以通过我的应用程序(甚至在root设备上)以任何其他方式访问此文件。

要使用的加密类型尚未修复,因此我对任何最适合此情况的算法持开放态度。

我想在播放之前解密每个文件。文件大小最大为25MB,此类文件的AES加密/解密大约需要300毫秒,因此不会对用户体验造成太大影响。

我在这里看到两个不同的解密方法:

  1. 如果我解密文件并将其作为普通音频文件存储在设备上,则用户可以访问它(root设备)并在我的应用程序之外使用它。
  2. 如果我解密文件并将其保存在系统内存中,就像一个字节数组一样,我该如何将其播放回用户?我发现使用MediaPlayer无法做到这一点,或者找到了任何其他可以开箱即用的库。也许可以修改一些音频流库来播放解密的文件流?

3 个答案:

答案 0 :(得分:4)

简单的方法,IMO,是使用ExoPlayer,这是一个由谷歌开发的开源媒体播放器。他们用很多边缘案件来处理这个项目,并且它是一个漂亮可靠的玩家。

最重要的是,您的需求很容易实现开箱即用。

您只需使用AesCipherDataSource包裹FileDataSource来加载播放器。

因此,您的文件使用AesCihper进行本地加密,并在运行时自动解密,然后由玩家自己进行分块。

以下是他们的开发指南的链接:https://google.github.io/ExoPlayer/guide.html 和AesCipher http://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.html

答案 1 :(得分:1)

有许多方法可以实现您的目标,其中一些方法如下:

  1. 使用MediaPlayer.setDataSource(Context, Uri)
  2. 从指定的网址流式传输您的文件
  3. 使用HttpURLConnection.getInputStream()获取本地InputStream创建FileInputStream并使用MediaPlayer.setDataSource(FileInputStream.getFD())
  4. 使用HTTP请求下载您的音频文件,但在保存之前应用一些加密。当您想要播放时,应用您的解密算法,从已保存的文件中检索流转换为FileInputStream并使用MediaPlayer.setDataSource(FileInputStream.getFD())
  5. 更新:还有一种替代MediaPlayer的方法可能对您的需求有用*: https://github.com/google/ExoPlayer

答案 2 :(得分:0)

  1. 由于您正在处理加密数据,如果您不希望以最佳方式公开任何内容,请自行实施MediaPlayer ... 所以基本上你就是那个解码它的人。可能值得一看Android的一些开源媒体播放器

  2. 不使用内存,而是使用不同的方法作为localhost进行流式传输。设置一个小型HTTP服务器。这样,您一次可以在设备上保留最少量的解密数据。