HLS AES Encryption

更新时间:2024-04-28 11:40:16

HLS AES 加密是一种使用 HLS (HTTP Live Streaming) 协议对视频流进行加密的方法,它采用 AES-128 算法对视频文件进行加密。AES-128,作为一种块加密算法,通过加密和解密 128 位的数据块,是用于 HLS 的最常见的加密方式。由于 AES 是对称密钥加密算法,加密和解密过程均需要使用相同的密钥。这意味着内容提供者使用特定的密钥加密视频,而观看者的播放器使用相同的密钥进行解密。
HLS 使用 EXT-X-KEY 标签在 m3u8 播放列表中提供关键信息,使播放器能够解密视频内容。该标签包括加密方法(METHOD)和密钥位置(URI)。示例如下:

#EXT-X-KEY:METHOD=AES-128,URI="https://keypathURI/hls_aes.key",IV=0x00000000000000000000000000000000

加密后,在播放视频文件前,播放器会从 URI 指定的服务器地址请求解密所需的密钥。为了确保密钥安全,您可以在密钥获取的 URL 中加入鉴权参数,这样可以防止非法用户访问您的密钥。

如何使用 HLS AES 加密

HLS AES加密需要对您的原始视频文件进行加密转码。使用前,您需要确保:

  • 您已经将您的原始视频文件上传到Object Storage的存储桶中。
  • 您的账号已经开通了点播文件处理的功能。

关于如何使用点播文件处理,请参考如何调用点播文件处理API

第一步:生成 RSA 密钥

当您使用 HLS AES 加密转码 API 时,必须在请求体中包含 AES 秘钥值(hlsKey),这个密钥不仅用于视频文件的加密,也用播放时视频文件的解密,任何获取到该AES密钥值的用户,都将可以解密播放您的视频。为了确保在 API 请求过程中密钥不被第三方恶意截获,您需要在调用 API 之前,对 AES 密钥进行 RSA 加密。所以首先,您应准备进行 RSA 加密所需的密钥。以下是准备 RSA 加密密钥的必要步骤:

生成 RSA 私钥和公钥

运行以下命令以生成私钥和公钥:

# 生成私钥
openssl genrsa -out private.key 2048
# 生成公钥
openssl rsa -in private.key -pubout -out pub.key

这里的 private.keypub.key 是生成的密钥文件名称,您可以根据需要自定义这些名称。生成公钥和私钥后,请确保将它们安全地保存以供将来使用。

提交您的 RSA 私钥

为确保我们能有效处理视频文件的加密,需要您在我们的系统中配置您的 RSA 私钥。此步骤是必要的,因为我们将使用该私钥来解密 HLS 加密中使用的 AES 密钥值(hlsKey)。请先将您的 RSA 私钥文件内容进行 Base64 编码,然后将编码后的值提交给我们的客户服务团队,以便我们将其配置到系统后台。如需了解如何读取 RSA 私钥文件并进行 Base64 编码的具体步骤,请参考我们提供的 RSA 私钥示例

第二步:构建 fops

fops是用于点播文件处理的重要指令,通过fops我们的媒体处理服务器将了解需要如何对您的文件进行处理。在调用点播文件处理API来加密视频时,您需要将fops来构造请求体。用于 AES HLS 加密转码的 fops 结构如下

<op>/<Format>
  /hlsKey/<hlsKey>
  /hlsKeyUrl/<hlsKeyUrl>
  |saveas/<Urlsafe_Base64_Encode(bucket:filekey)>

参数hlsKey

hlsKey 是前文提到的 AES 密钥值。您可以通过 OAEP 填充和 Base64 编码,再使用 RSA 公钥对密钥的原始明文值进行加密,最终生成 hlsKey。例如,如果您的密钥原始明文值为 01234566543210abcdef888888abcdef,您可以使用以下命令进行 OAEP 填充和 Base64 编码,并通过 RSA 公钥加密:

openssl rand -hex 16
echo -n "01234566543210abcdef888888abcdef" | openssl rsautl -encrypt -pubin -inkey pub.key -oaep | openssl base64 -A | tr "+/" "-_"

执行后,您将得到加密后的 hlsKey。

参数hlsKeyUrl

hlsKeyUrl 是用于获取解密密钥的 URL。视频加密完成后,这个 URL 将包含在 HLS 的 m3u8 文件中。播放视频时,播放器将通过此 URL 获取所需的解密密钥。您可以选择使用自己的密钥管理服务器的地址作为 hlsKeyUrl 的值,或者将密钥上传到 Object Storage 存储桶并使用该地址。例如,如果可以将 hlsKey 的明文值 01234566543210abcdef888888abcdef 存储为一个文件,可以使用以下命令创建密钥文件:

echo -ne "\x01\x23\x45\x66\x54\x32\x10\xab\xcd\xef\x88\x88\x88\xab\xcd\xef" > key.hex

接着,将该文件上传到您的 Object Storage 存储桶。复制该文件在 Object Storage 中的可访问 URL,并使用此 URL 作为 hlsKeyUrl 的值,例如:

https://bucketname.s3-cn-north-1.wcsapi.com/key.hex

第三步:执行加密转码

使用以下 API 请求对存储在 vod-wcs-test001 存储桶中的 test_hls.m3u8 文件进行加密转码:

curl -v -X POST \
  -d "bucket=Urlsafe_Base64_Encode(vod-wcs-test001)&key=Urlsafe_Base64_Encode(test_hls.m3u8)&fops=Urlsafe_Base64_Encode(avthumb/m3u8/hlsKey/加密后的hlsKey/hlsKeyUrl/https://bucketname.s3-cn-north-1.wcsapi.com/key.hex|saveas/Urlsafe_Base64_Encode(vod-wcs-test001:hls_aes_.m3u8))&force=1&separate=1" \
  -H "Authorization: AccessKey EncodeSign" \
  --url "http://mgrDomain/fops"

成功转码后,输出视频将位于指定存储桶中,您的 HLS 视频 m3u8 文件将包含 EXT-X-KEY 字段,表示视频已经加密。

本篇文档内容对您是否有帮助?
有帮助
我要反馈
提交成功!非常感谢您的反馈,我们会继续努力做到更好!