在本部分中,我们将介绍两种不同的媒体加密策略,以及一些有关如何将这些策略与 FFmpeg 和 Shaka Packager 搭配使用的实用示例。我们将讨论的两种加密策略是 Clear Key 和使用 Google Widevine 等服务。这两种策略都是数字版权管理 (DRM) 的一种形式,用于控制用户可以对您的媒体执行哪些操作。但是,由于密钥传递以进行身份验证的方式,两者在安全性方面本质上存在差异,因此 DRM 服务可能更合适。
适用于 Web 的主要 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
使用明文密钥进行加密
以下示例使用使用原始密钥的 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
Widevine 加密
现在,您已经了解了什么是 Clear Key 加密以及何时使用它。但是,您何时应使用 DRM 服务来增强安全性?此时,Widevine 或其他服务将用于安全地加密和解密您的媒体内容。Widevine 支持 MPEG-DASH 和 HLS,是 Google 提供的 DRM。Google Chrome 和 Firefox 网络浏览器、Android MediaDRM、Android TV 以及使用加密媒体扩展和媒体源扩展的其他消费类电子设备都使用 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
除了文件名和 --content-id
标志之外,解复用器 (demux) 命令中的所有内容都应照搬示例中的内容。--content-id
是 16 位或 32 位随机十六进制数字。请使用此处提供的密钥,而不是您自己的密钥。如需查看更多示例,请参阅有关使用 Widevine 密钥服务器的 Shaka Packager 文档。
解复合(分离)音频和视频,对新文件进行加密,并输出媒体呈现说明 (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"
重新混流(合并)音频和视频串流。如果您使用的是视频框架,则可能无需执行此操作。
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
媒体转换序列
本部分按顺序显示了从原始 .mov
文件获取为 DASH 或 HLS 打包的加密资产所需的命令。为了达到说明目的,我们将源文件转换为码率为 8 Mb/s 且分辨率为 1080p (1920 x 1080) 的文件。根据需要调整这些值。
DASH/WebM
转换文件类型和编解码器。
对于此命令,您可以为音频编解码器使用
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
创建一个明文密钥加密密钥。
openssl rand -hex 16 > media.key
解复合(分离)音频和视频,对新文件进行加密,并输出媒体呈现说明 (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
重新混流(合并)音频和视频串流。如果您使用的是视频框架,则可能无需执行此操作。
ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
DASH/MP4
转换文件类型、视频编解码器和比特率。
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
创建一个明文密钥加密密钥。
openssl rand -hex 16 > media.key
解复合(分离)音频和视频,对新文件进行加密,并输出媒体呈现说明 (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
重新混流(合并)音频和视频串流。如果您使用的是视频框架,则可能无需执行此操作。
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
HLS/MP4
HLS 仅支持 MP4,因此您首先需要转换为 MP4 容器和受支持的编解码器。
转换文件类型、视频编解码器和比特率。
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
创建一个明文密钥加密密钥。
openssl rand -hex 16 > media.key
创建密钥信息文件
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
以上内容有点多,但希望您现在能够放心地对媒体内容进行加密。接下来,我们将向您展示如何向网站添加媒体内容。