媒体加密

德里克·赫尔曼
Derek Herman
Joe Medley
Joe Medley

在本部分,我们将介绍两种不同的媒体加密策略,并提供一些实际示例来说明如何将其与 FFmpeg 和 Shaaka Packager 结合使用。我们要讨论的两种加密策略是清除密钥,以及使用 Google Widevine 等服务。这两种策略都是一种数字版权管理 (DRM) 形式,用于控制用户可以对您的媒体内容执行哪些操作。但是,由于传递密钥进行身份验证的方式,两者本质上不如另一种方法,这正是 DRM 服务合理的原因。

适用于 Web 的主要 DRM 服务是 Google WidevineMicrosoft PlayReadyApple FairPlay,但本文不逐一介绍所有这些服务。但是,如果您的目标平台是所有现代浏览器,则很有可能会使用全部三种 DRM 服务。

转化和加密通过以下应用完成:

清除密钥加密

首先,您应该在使用“清除键”之前充分了解什么是“清除键”,以及“不”是什么。如果您希望使用现有 DRM 服务,并且认为对媒体进行基本加密是可行的选择,则可以使用“清除密钥”。但请注意,这种加密不能提供与使用某个 DRM 服务相同的安全级别。这是因为,与由存储在许可服务器上的解密密钥生成的加密密钥不同,加密密钥值对未使用另一个密钥进行加密。此外,“清除密钥”会以纯文本形式发送键值对,因此在加密媒体时,用于解密的密钥不是密钥。

创建密钥

您可以使用相同的方法为 DASH 和 HLS 创建密钥。您可以使用 OpenSSL 执行此操作。以下命令将创建一个由 16 个十六进制值组成的加密密钥。

openssl rand -hex 16 > media.key

创建 IV

接下来,我们可以生成一个初始化向量 (IV)。

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

使用清除密钥进行加密

以下示例使用具有原始密钥的 Shaka Packager,其中 keyskey_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

Widevine 加密

现在,您已经了解了什么是清除密钥加密,以及何时使用该功能。但是,您应该何时使用 DRM 服务来提高安全性?您可以在此处使用 Widevine 或其他服务来安全地加密和解密您的媒体。Widevine 支持 MPEG-DASH 和 HLS,并且是 Google 的 DRM。Google Chrome 和 Firefox 网络浏览器、Android MediaDRM、Android TV 以及其他使用 Encrypted Media Extensions 和 Media Source Extensions 的消费类电子产品设备(使用 Widevine 解密内容)均使用 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 个随机十六进制数字。请使用此处提供的密钥,而不是您自己的密钥。如需查看更多示例,请参阅关于使用 Widevine 密钥服务器的 Shaka 打包器文档。

  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 Mbs、分辨率为 1080p (1920 x 1080) 的源文件。根据您的需求调整这些值。

DASH/WebM

  1. 转换文件类型和编解码器。

    对于此命令,您可以使用 liborbislibopus 作为音频编解码器。

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. 创建清除密钥加密密钥。

    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
    

DASH/MP4

  1. 转换文件类型、视频编解码器和比特率。

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. 创建清除密钥加密密钥。

    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
    

HLS/MP4

HLS 仅支持 MP4,因此首先您需要转换为 MP4 容器和受支持的编解码器。

  1. 转换文件类型、视频编解码器和比特率。

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. 创建清除密钥加密密钥。

    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
    

这些内容很难消化,但希望您现在能够信心十足地对媒体进行加密。接下来,我们将介绍如何向网站添加媒体内容