2017-02-01 2 views
2

Как мне поиграть в набор зашифрованных аудиофайлов в приложении для Android-плееров?Android-зашифрованный аудиоплеер

У меня есть проект приложения, где у меня будет набор зашифрованных аудиоконтента, хранящихся на устройстве пользователя. Один аудиоконтент (пример: подкаст) в этом случае будет состоять из нескольких зашифрованных файлов. Приложение работает как аудиоплеер, через который пользователи прослушивают этот аудиоконтент. Для удобства пользователей весь контент (подкаст) должен беспрепятственно воспроизводиться из одного файла в другой. Это отлично работает для обычных аудиофайлов с использованием класса MediaPlayer от android.

Для обеспечения безопасности файл дешифрованного файла ни в коем случае не должен присутствовать на хранилище пользовательских устройств таким образом, чтобы пользователь мог получить доступ к этому файлу любым другим способом, чем через мое приложение (даже на корневых устройствах).

Тип шифрования, который будет использоваться, еще не исправлен, поэтому я открыт для любого алгоритма, который лучше всего подходит для этого случая.

Я думал о расшифровке каждого файла перед его воспроизведением. Размер файлов не должен превышать 25 МБ, а шифрование/дешифрование AES для такого файла занимает около 300 миллисекунд, поэтому это не мешает слишком многому пользователю.

Есть две проблемы, я вижу здесь с двумя различными подходами к расшифровке:

  1. Если я расшифровать файл и сохранить его на устройстве, как обычный звуковой файл, пользователь сможет получить к нему (корневые устройства) и использовать его вне моего приложения.
  2. Если я дешифрую файл и сохраняю его в системной памяти, как можно сказать, массив байтов, как я могу воспроизвести это обратно пользователю? Я не нашел способа сделать это с помощью MediaPlayer или нашел любую другую библиотеку, которая позволила бы это сделать из коробки. Может быть, некоторая библиотека потокового аудио может быть изменена для воспроизведения дешифрованного файлового потока?

ответ

4

самые простые пути, ИМО, является использование ExoPlayer, который является открытым - медиа-проигрыватель, разработанный Google. Они рассматривали этот проект с множеством краевых дел, и это хороший и надежный игрок.

Кроме того, ваши потребности легко достичь в значительной степени из-за коробки.

Вы просто загрузите плеер, используя AesCipherDataSource обертывание FileDataSource.

Таким образом, ваш файл локализован локально с использованием AesCihper и дешифрован на лету, кусок куском самого игрока.

Вот ссылка на их Dev-гид: https://google.github.io/ExoPlayer/guide.html и к AesCipher http://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.html

+0

интересно посмотреть, если вы на самом деле видели это работает? В прошлом я использовал ExoPlayer 1 с пользовательским DataSource и смог получить RC4 Ciphers, работающий, но не AES. Теперь похоже, что они добавили специальный AesCipher специально для этого, но я все еще не получил его для работы ... –

+1

Это похоже на лучшее решение. На данный момент я реализую немного другой подход, где я буду расшифровывать файлы в байтовый массив, который я буду, чем передавать через DataSource в ExoPlayer. Если бы я использовал AesCipherDataSource, как мне передать параметры AES IV? Связанная документация содержит только опцию для передачи secretKey в нее. AesCipherDataSource (byte [] secretKey, DataSource upstream). – ak93

+0

Я нашел этот поток, который находится на тему для шифрования exoPlayer и AES: https://github.com/google/ExoPlayer/issues/2467 Кажется, что заставить это работать не так просто и вызывает такие проблемы, как медленный поиск. – ak93

0
  1. Так как вы имеете дело с зашифрованными данными, если вы не хотите, чтобы выставить что-нибудь лучше всего было бы реализовать MediaPlayer сами ... Так в основном вы бы быть один из декодирования. может быть стоит посмотреть на некоторых медиа-плееров с открытым исходным кодом для Android

  2. Вместо того, чтобы использовать память другой подход будет потоковое, как локальный. настройка небольшого HTTP-сервера. таким образом вы будете хранить наименьшее количество расшифрованных данных на устройстве за раз.

1

Есть много способов сделать достижения этой цели некоторые из них приведены ниже:

  1. поток файла из заданного URL с помощью MediaPlayer.setDataSource(Context, Uri)
  2. Используйте HttpURLConnection.getInputStream(), чтобы получить местные InputStream создать FileInputStream и использовать MediaPlayer.setDataSource(FileInputStream.getFD()).
  3. Загрузите аудиофайл с помощью HTTP-запроса, но перед сохранением применить некоторое шифрование. Когда вы хотите играть, примените свой алгоритм дешифрования, извлеките поток из сохраненного файла в FileInputStream и используйте MediaPlayer.setDataSource(FileInputStream.getFD()).

Обновление: Существует также альтернатива MediaPlayer, что может быть полезно использовать для ваших нужд *: https://github.com/google/ExoPlayer

Смежные вопросы