HLS标准加密使用AES_128进行内容加密,适配所有HLS播放器,需要配合密钥管理服务和令牌服务使用,被广泛应用于在线教育、独播剧等对内容安全性要求较高的领域。本文为您介绍如何对视频进行HLS标准加密以及如何进行解密播放。
升级说明
视频点播于2022年08月升级了HLS标准加密服务,优化了加密流程和逻辑,但旧的加密流程仍然可用,建议您使用新的加密流程。若因业务需要,您仍需使用旧的加密流程,可参考HLS标准加密(旧)。
工作原理
视频点播采用信封数据加密的方式加密视频。业务方调用阿里云密钥管理服务(KMS)生成数据密钥(DK)和信封数据密钥(EDK),然后利用数据密钥(DK)加密视频,并将加密后的文件和信封数据密钥(EDK)存储。播放器终端通过解密服务获取数据密钥(DK)请求解密播放视频。
如果您需要对解密地址进行安全验证,可以通过开启M3U8标准加密改写(默认改写的参数名为MtsHlsUriToken
)实现对HLS数据访问过程的再次加密保护。M3U8标准加密改写的开启方式及技术原理请参见HLS(M3U8)标准加密改写。
加密及解密流程
上传及加密流程
解密播放流程
开启M3U8标准加密改写(推荐)
未开启M3U8标准加密改写
前提条件
加密视频
创建Service Key。
Service Key是密钥管理服务的一种加密主Key,接入标准加密的密钥必须要使用该Service Key生成,若不创建Service Key,则后续调用GenerateKMSDataKey - 创建KMS数据密钥接口生成密钥时将会报错。
登录视频点播控制台,选择配置管理 > 媒体处理配置 > 标准加密。
单击页面左上方的服务地域标识,切换到需要创建Service Key的服务地域下。
说明创建的Service Key与视频存储的源站地域必须一致,例如:视频存储在华东2(上海),则Service Key必须在华东2(上海)创建。
在标准加密页面,单击创建Service Key。
创建成功后,会提示您密钥(Service Key)创建成功,且在密钥信息区域可以查看您的Service Key。
说明若已提示密钥创建成功,仍未看到Service Key,可能是由于服务角色缺失导致,您可以通过重新授权恢复角色后再刷新页面查看Service Key。
创建用于HLS标准加密的转码模板组。
HLS标准加密过程中需要用到两个转码模板组:不转码模板组和用于HLS标准加密的模板组。
其中,不转码模板组为系统内置的模板组,您无需创建可以直接使用;用于HLS标准加密的模板组需要您自行创建。创建方法如下:
搭建加密服务。
调用GenerateKMSDataKey - 创建KMS数据密钥接口生成数据密钥(DK)和信封数据密钥(EDK)。
调用该接口无需传任何参数,接口调用成功后,返回参数
CiphertextBlob
即为信封数据密钥(EDK),返回参数Plaintext
即为数据密钥(DK);其中,CiphertextBlob
是一个AES_128的密钥,请保存该参数值用于后续发起标准加密转码时传入。使用不转码模板组上传视频。
因在视频点播中上传视频时会触发自动转码,而自动触发的转码暂不支持HLS标准加密,因此需要HLS标准加密的视频,在上传时需要使用系统内置的不转码模板组进行上传,以防止上传时自动触发转码。
通过视频点播控制台上传,请参见通过视频点播控制台上传文件;通过服务端接口上传,请参见媒体上传。
配置视频点播的事件通知,当接收到视频上传完成的回调消息时,则表明视频已经上传到视频点播中。事件通知的配置方法,请参见事件通知。
发起HLS标准加密转码。
调用SubmitTranscodeJobs - 提交媒体转码作业接口,发起HLS标准加密转码。
查看HLS标准加密结果。
转码完成后,您可以通过如下两种方式来判断标准加密是否成功。
方式一:登录视频点播控制台,选择媒资库 > 音/视频 > 管理 > 视频地址,在视频地址页面,如果视频有多种格式的输出(例如还存在格式为mp4的原始文件),只需要查看m3u8格式的视频流是否带有标准加密字样,如果存在,则表明标准加密成功。
方式二:将带有标准加密字样的M3U8文件的地址拷贝出来,使用命令
curl -v "M3U8文件地址"
,查看获取到的M3U8内容是否存在URI="<业务方在发起标准加密时传递的解密URI地址,即DecryptKeyUri参数值>"
关键信息,有则表明为标准加密且加密成功。
播放HLS标准加密视频
搭建解密服务。
搭建一个本地HTTP服务,用于解密视频。
调用DecryptKMSDataKey - 解密KMS数据密钥密文接口进行解密,该接口返回的数据密钥(DK)即
PlainText
是GenerateKMSDataKey - 创建KMS数据密钥接口返回的PlainText
经过base64_decode之后的数据。如果您需要对解密地址进行安全验证,可以通过开启M3U8标准加密改写(默认改写的参数名为
MtsHlsUriToken
)实现对HLS数据访问过程的再次加密保护。M3U8标准加密改写的开启方式及技术原理请参见HLS(M3U8)标准加密改写。根据您是否开启M3U8标准加密改写,搭建解密服务的代码实现不同,具体如下:开启M3U8标准加密改写(推荐)
未开启M3U8标准加密改写
获取视频播放地址和凭证。
调用GetVideoPlayAuth - 获取音视频播放凭证接口获取播放凭证或调用GetPlayInfo - 获取音视频播放地址接口获取播放地址。
播放加密视频。
HLS标准加密支持所有的HLS播放器,您可以选择使用自研的播放器或阿里云播放器进行播放加密视频。
如果使用阿里云播放器,请按照阿里云播放器的要求获取令牌和鉴权信息后播放,详情请参见播放HLS标准加密视频-Web端。如果使用非阿里云播放器,请自行实现播放逻辑。
使用阿里云播放器测试播放的内部流程解析如下:
开启M3U8标准加密改写(推荐)
流程
获取M3U8文件地址后,播放器会解析M3U8文件中的EXT-X-KEY标签中的URI并访问,从而获取到带密文密钥的解密接口URI,此URI为您发起标准加密时传递的加密配置 EncryptConfig中的
DecryptKeyUri
参数值。只允许合法用户才可以访问,那么需要播放器在获取解密密钥时携带您承认的认证信息,认证信息可以通过MtsHlsUriToken参数传入。
播放器在解析到解密地址URI时会自动请求解密接口获取解密密钥,拿到解密密钥去解密加密过的ts文件进行播放。
示例
视频的播放地址为:
https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8
,则请求时需要携带MtsHlsUriToken
参数传入最终请求地址为:
https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8?MtsHlsUriToken=<令牌>
解密地址为:
https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****
最终解密请求地址为:
https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****&MtsHlsUriToken=<颁发的令牌>
未开启M3U8标准加密改写
流程
获取M3U8文件地址后,播放器会解析M3U8文件中的
EXT-X-KEY
标签中的URI并访问,从而获取到带密文密钥的解密接口URI,此URI为您发起标准加密时传递的加密配置 EncryptConfig中的DecryptKeyUri
参数值。播放器在解析到解密地址URI时会自动请求解密接口获取解密密钥,拿到解密密钥去解密加密过的ts文件进行播放。
示例
视频的播放地址为:
https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8
最终请求地址为:
https://demo.aliyundoc.com/encrypt-stream****-hd.m3u8
解密地址为:
https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****
最终解密请求地址为:
https://demo.aliyundoc.com?CipherText=ZjJmZGViNzUtZWY1Mi00Y2RlLTk3MTMtOT****