Шифрование мультимедиа

Дерек Херман
Derek Herman
Джо Медли
Joe Medley

В этом разделе мы рассмотрим две разные стратегии шифрования ваших медиафайлов, а также несколько практических примеров их использования с FFmpeg и Shaka Packager. Мы обсудим две стратегии шифрования: Clear Key и использование такого сервиса, как Google Widevine . Обе стратегии представляют собой форму управления цифровыми правами ( DRM ), позволяющую контролировать, что пользователи могут делать с вашими медиафайлами. Однако один из них по своей сути менее безопасен, чем другой, из-за способа передачи ключей для аутентификации, и именно поэтому служба DRM может иметь больше смысла.

Основными сервисами DRM для Интернета являются Google Widevine , Microsoft PlayReady и Apple FairPlay , но в этой статье мы не будем описывать их все. Однако если вы ориентируетесь на все современные браузеры, вы, скорее всего, будете использовать все три службы DRM.

Преобразование и шифрование выполняются с помощью следующих приложений:

Очистить ключ шифрования

Во-первых, вы должны хорошо понимать, что такое Clear Key, а что нет, прежде чем использовать его. Если вы не хотите использовать существующую службу DRM и считаете, что базовое шифрование ваших медиафайлов является целесообразным вариантом, вы можете использовать Clear Key. Но имейте в виду, что этот тип шифрования не обеспечивает тот же уровень безопасности, что и использование одной из служб DRM. Это связано с тем, что пара ключ-значение не шифруется под другим ключом, в отличие от зашифрованных ключей, которые генерируются ключом дешифрования, хранящимся на сервере лицензий. Кроме того, Clear Key отправляет пару «ключ-значение» в виде обычного текста, поэтому, пока вы шифруете медиафайл, ключ для его расшифровки не является секретом.

Создать ключ

Вы можете использовать один и тот же метод для создания ключа как для DASH, так и для HLS. Сделайте это с помощью OpenSSL . Следующее создаст ключ шифрования, состоящий из 16 шестнадцатеричных значений.

openssl rand -hex 16 > media.key

Создать IV

Далее мы можем сгенерировать вектор инициализации (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Шифрование с помощью Clear Key

В следующем примере используется Shaka Packager с необработанными ключами , где keys и key_ids предоставляются непосредственно Shaka Packager. Прочтите документацию для получения дополнительных примеров.

В качестве флага key используйте созданный ранее ключ, который хранится в файле media.key . Однако при вводе его в командной строке убедитесь, что вы удалили пробелы. Для флага key_id повторите значение media.id или используйте значение IV, сгенерированное выше.

packager \
  input=glocken.mp4,stream=audio,output=glockena.m4a \
  input=glocken.mp4,stream=video,output=glockenv.mp4 \
  --enable_fixed_key_encryption \
  --keys label=audio:key=INSERT_AUDIO_KEY_HERE:key_id=INSERT_AUDIO_KEY_ID_HERE,label=video:key=INSERT_VIDEO_KEY_HERE:key_id=INSERT_VIDEO_KEY_ID_HERE

Создайте файл с ключевой информацией

Для шифрования для HLS вам понадобится файл с ключевой информацией в дополнение к файлу ключа. Файл ключевой информации представляет собой текстовый файл в формате, указанном ниже. Он должен иметь расширение .keyinfo . Например: encrypt.keyinfo .

key URI
key file path
private key

URI ключа — это место, где на вашем сервере будет расположен созданный выше media.key (. Путь к файлу ключа — это его местоположение относительно файла с информацией о ключе. Наконец, закрытый ключ — это содержимое самого файла media.key или IV, который вы создали ранее. Например:

https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66

Шифрование для HLS

packager \
  'input=input.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
  'input=input.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
  --hls_master_playlist_output="master_playlist.m3u8" \
  --hls_base_url="http://localhost:5000/"

Эта команда примет ключ длиной 16 или 32 символа.

ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8

Широкое шифрование

Теперь вы знаете, что такое шифрование Clear Key и когда его использовать. Но когда вам следует использовать службу DRM для дополнительной безопасности? Именно здесь Widevine или другой сервис будет использоваться для безопасного шифрования и дешифрования ваших медиафайлов. Widevine поддерживает MPEG-DASH и HLS и является DRM от Google. Widevine используется веб-браузерами Google Chrome и Firefox, Android MediaDRM, Android TV и другими устройствами бытовой электроники, которые используют расширения зашифрованных мультимедиа и расширения источников мультимедиа, где Widevine расшифровывает контент.

Шифрование с помощью Widevine

В большинстве примеров в этой статье использовалось шифрование Clear Key. Однако для Widevine вам потребуется заменить следующие параметры.

--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE

Все в команде демультиплексора (demux), кроме имени ваших файлов и флага --content-id , должно быть скопировано точно из примера. --content-id состоит из 16 или 32 случайных шестнадцатеричных цифр. Используйте предоставленные здесь ключи вместо своих собственных. Дополнительные примеры можно найти в документации Shaka Packager по использованию сервера ключей Widevine .

  1. Демуксируйте (разделяйте) аудио и видео, шифруйте новые файлы и выводите файл описания медиапрезентации (MPD).

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_widevine_encryption \
      --key_server_url "https://license.uat.widevine.com/cenc/getcontentkey/widevine_test" \
      --content_id "fd385d9f9a14bb09" \
      --signer "widevine_test" \
      --aes_signing_key "1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9" \
      --aes_signing_iv "d58ce954203b7c9a9a9d467f59839249"
    
  2. Remux (объединить) аудио и видео потоки. Если вы используете видеофреймворк, возможно, вам не придется этого делать.

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
    

Последовательность преобразования медиа

В этом разделе показаны команды, необходимые для перехода из необработанного файла .mov в зашифрованные ресурсы, упакованные для DASH или HLS. Для иллюстрации мы конвертируем исходный файл в битрейт 8 Мбит/с и разрешение 1080p (1920 x 1080). Отрегулируйте эти значения в соответствии с вашими потребностями.

ДАШ/ВебМ

  1. Преобразуйте тип файла и кодек.

    Для этой команды вы можете использовать либо liborbis , либо libopus в качестве аудиокодека.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Создайте ключ шифрования Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Демуксируйте (разделяйте) аудио и видео, шифруйте новые файлы и выводите файл описания медиапрезентации (MPD).

    packager \
      input=tmp_glocken.webm,stream=video,output=glocken_video.webm \
      input=tmp_glocken.webm,stream=audio,output=glocken_audio.webm \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_webm_vod.mpd
    
  4. Remux (объединить) аудио и видео потоки. Если вы используете видеофреймворк, возможно, вам не придется этого делать.

    ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
    

ДЭШ/MP4

  1. Конвертируйте тип файла, видеокодек и битрейт.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Создайте ключ шифрования Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Демуксируйте (разделяйте) аудио и видео, шифруйте новые файлы и выводите файл описания медиапрезентации (MPD).

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_mp4_vod.mpd
    
  4. Remux (объединить) аудио и видео потоки. Если вы используете видеофреймворк, возможно, вам не придется этого делать.

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
    

ЗВУ/MP4

HLS поддерживает только MP4, поэтому сначала вам необходимо преобразовать его в контейнер MP4 и поддерживаемые кодеки.

  1. Конвертируйте тип файла, видеокодек и битрейт.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Создайте ключ шифрования Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Создайте файл с ключевой информацией

    packager \
      'input=glocken.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
      'input=glocken.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
      --hls_master_playlist_output="master_playlist.m3u8" \
      --hls_base_url="http://localhost:5000/" \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE
    

Это было очень сложно переварить, но, надеюсь, теперь вы можете с уверенностью шифровать свои медиафайлы. Далее мы покажем вам, как добавить медиафайлы на ваш сайт.