本文档介绍HLS普通加密。 由于无法防止部分浏览器插件和灰色工具的破解,因此不再推荐使用。 强烈建议您使用HLS私有加密。
针对视频行业对版权保护的需求,云点播提出了基础级的DRM(数字版权管理)解决方案,使用HLS的普通AES加密技术对视频内容进行加密,确保您的内容安全。
HLS普通加密方案
加密演算法
云点播系统目前支持HLS中指定的加密方案(HLS普通AES加密技术),使用AES-128对视频内容本身进行加密。
播放器兼容性
云点播视频加密解决方案可支持所有HLS播放器。
局限性
仅支持2017版本接口:用于发起加密任务并查询加密结果。
新版本接口不支持HLS普通加密。
术语介绍
密钥管理服务(Key,简称KMS)
安全管理服务,主要负责数据密钥的生产、加密和解密。 例如腾讯云的密钥管理服务。
数据密钥(简称DK)
由KMS系统生成的密钥,用于对称加解密。
加密数据密钥(简称EDK)
经过KMS系统加密的DK可以用于公开分发。 将EDK换成DK,需要调用KMS的解密接口。
整体结构
视频加密过程是通过转码操作实现的,不会产生新的。 与一般转码场景相比,视频加密转码的主要区别在于:
加密转码,传输的视频被加密。
加密转码完成后,如果通过点播播放器播放视频,将无法获取源文件播放地址。
准备
设置密钥管理服务 (KMS)
密钥管理服务主要用于管理视频密钥。 视频加密过程需要与KMS系统交互。 步骤包括:
1. 生成用于视频加密的数据密钥,这是架构图中的步骤II。 此步骤将返回 DK 和 EDK。 后续步骤中,可以访问DK的角色包括:云点播转码服务、App后台以及通过合法身份验证的终端用户。 EDK可以分发给任何用户,但通过EDK获取DK的步骤需要App后端进行身份验证。
2、根据EDK获取DK进行数据播放,即架构图中的第4步。 App后端通过用户身份认证后,需要调用KMS相关接口,使用EDK获取DK,即架构图中的第5步。
为了最大限度降低开发者的接入成本,Cloud On 集成了KMS服务,并提供最简单的调用接口。 整个视频加密方案中,App后端与KMS服务之间唯一的交互就是获取解密密钥(架构图中的步骤5)。
构建身份验证和密钥分发服务
对于加密视频,只有经过App后端认证的客户端才能获取DK。 因此,最终客户获取密钥的行为必须涉及App后端进行认证。 服务的主要业务逻辑是:
1. 针对客户端请求携带EDK换取DK的情况(即架构图中的步骤4),验证请求者的身份。
2、如果身份认证通过,则去KMS系统获取对应的DK(即架构图中的步骤5)并返回给客户端。
建议
由于EDK对应的DK始终是固定的,因此App后端可以缓存(甚至永久保存)EDK与DK的对应关系,以减少对KMS系统的调用次数(即减少中步骤5的调用次数)架构图)。
App后端响应客户端,通过添加HTTP缓存控制参数(如Cache-)来减少客户端去App后端获取DK的次数(即减少架构中第4步的调用次数)图表)。
如果您需要支持浏览器播放,为了避免跨域问题,请确保“认证与密钥分发服务”和“视频播放页面”使用的域名相同(例如域名视频播放页面的名称是,那么密钥分发服务的域名也需要是)。
配置视频加密模板
为了保证云点播后端能够正确进行加密操作,您需要配置视频加密模板。 详细信息请参见HLS通用加密模板。
业务流程
视频上传
现有视频文件可以通过服务器上传、客户端上传、控制台上传、录音上传、URL拉取上传等方式上传到云点播平台。
视频加密
视频加密的主要步骤如下:
1、App后台发起视频加密
目前您可以通过界面发起视频加密。 目前仅支持 HLS 文件加密。
下面这个例子的意思是:
对视频文件进行转码,转码目标输出模板为210、220、230、240。禁止从低码率转换到高码率。
转码过程使用加密模板10进行加密。
事件通知方式为:整个事件完成后发起事件通知。
https://vod.api.qcloud.com/v2/index.php?Action=ProcessFile&transcode.definition.0=210&transcode.definition.1=220&transcode.definition.3=230&transcode.definition.4=240&transcode.drm.definition=10&notifyMode=Finish&COMMON_PARAMS
2、从点播平台获取加密密钥
云点播平台根据调用方指定的加密参数模板,读取密钥获取方式以及最终用户获取解密密钥的URL(如),然后从指定的KMS系统。
3、点播平台发起视频加密转码
云点播转码平台在对视频进行加密时,不仅会根据指定的加密算法和密钥对目标输出文件进行加密,还会将获取解密密钥的URL写入到视频文件中。 例如,对于HLS,URL会被写入M3U8文件的EXT-X-KEY标签中,但在写入之前,转码平台会在URL中添加三个参数:
:加密文件的ID。
:固定为,表示腾讯云点播内置KMS。
edk:DK对应的EDK。
添加上述参数后,转码目标视频文件写入的URL可以为
https://getkey.example.com?fileId=123456&keySource=VodBuildInKMS&edk=abcdef
该URL也是客户端在视频播放过程中获取解密密钥时最终访问的URL。
4、点播平台发起加密完成回调
当包含加密操作的任务流状态发生变化(或完成)后,点播平台将发起任务流状态变化通知。
媒体资产管理
视频加密操作完成后,可以通过该接口获取视频的加密信息。
该接口将返回视频ID所有转码规范的视频播放地址,包括源文件的播放地址。 由于源文件没有加密,因此App服务器可以过滤掉源文件的播放地址,只提供加密视频的播放地址。 给客户。
获取到的源文件参数为0,可以根据该值过滤源文件的视频播放地址。
视频播放概述
只有具有合法身份认证的客户才会收到视频解密密钥。 因此,如何在播放过程中验证用户的身份信息就成为了关键因素。
播放过程中,播放器会访问M3U8文件中EXT-X-KEY标签标识的URL来获取密钥。 本步骤中,播放器需要携带观看者的身份认证信息。 此时,有两种方式可以将这些信息传递给App认证服务:
1、通过参数将用户身份信息附加到URL中,提供App的认证服务。 该解决方案适用于所有 HLS 播放器。 具体解决方案请参见:传递身份认证信息。
2. 将用户身份信息传递给App的认证服务。 该方案安全性较高,但仅适用于访问EXT-X-KEY标签标识的URL时携带的播放器。 具体解决方案请参见:传递身份认证信息。
视频播放解决方案1
视频播放方案一:通过身份认证信息传递,该方案适用于任何支持HLS的播放器。
1.登录并分发Token进行身份验证
只有具有合法身份认证的客户才会收到视频解密密钥。 因此,在播放视频之前,客户端必须登录,App服务器会向客户端发送一个包含身份认证信息的签名,我们称之为Token。
2、获取包含Key防盗签名的多码率播放地址
加密转码API的回调通知或者API可以获取加密视频的多码率播放地址。 客户端获得多码率播放地址后,需要在播放地址中添加用户身份信息。 对于任何播放URL,添加用户身份信息的方法都是添加.token。 URL 中文件名之前。
例如,用户身份信息标识为; 某码率的播放地址为:
http://example.vod2.myqcloud.com/path/to/a/video.m3u8
那么最终的URL就是:
http://example.vod2.myqcloud.com/path/to/a/voddrm.token.ABC123.video.m3u8
3.获取视频内容(加密)
当播放器按照上一步描述的流程访问带有用户身份信息的URL时,云点播后端会自动将Token信息附加到原始M3U8文件的EXT-X-KEY标签标识的URL中。
例如某码率的加密视频URL为:
http://example.vod2.myqcloud.com/path/to/a/video.m3u8
在该文件中,EXT-X-KEY标签标识的获取视频解密密钥的URL为:
https://getkey.example.com?fileId=123456&keySource=VodBuildInKMS&edk=abcdef
那么当播放器访问携带Token信息的播放地址时,即:
http://example.vod2.myqcloud.com/path/to/a/voddrm.token.ABC123.video.m3u8
用于获取由 EXT-X-KEY 标签标识的视频解密密钥的 URL 将替换为:
https://getkey.example.com?fileId=123456&keySource=VodBuildInKMS&edk=abcdef&token=ABC123
此时,当玩家获得解密密钥DK时,就会带上步骤1中分配的Token。
4.获取视频解密密钥(带身份验证)
当播放器获取视频索引文件(M3U8文件)时,在播放视频文件之前会自动启动步骤4。 App后端收到客户端的请求后,首先验证Token。 如果用户身份不合法,请求将被直接拒绝。 如果用户身份合法,则根据URL中携带的、、edk等参数从KMS系统获取DK并返回给客户端。 完成上述步骤后,客户端将获得视频解密密钥,可以进行正常的视频解密和播放。
视频播放解决方案2
视频播放方案二:通过传递身份认证信息。 该方案仅适用于iOS/PC平台的H5/Flash播放器。 在这个平台下,玩家访问EXT-X-KEY标签标识的URL时会带上它。
注意:
实际测试发现,平台的H5播放器在访问时不会携带EXT-X-KEY标签识别的URL,因此平台目前只能使用选项1。
1. 登录并分发密码进行身份验证
只有具有合法身份认证的客户才会收到视频解密密钥。 因此,在播放视频之前,客户端必须登录,App服务器向客户端发送签名。 例如,客户端使用账号和密码登录,通过身份认证后,App后端向客户端下发一个域名来识别用户。
2.获取指定视频的多码率播放地址
云点播网页视频播放器提供多码率播放能力,您可以获取视频对应的多码率播放地址。 如果您使用其他播放器,则需要自行获取多码率播放地址。
3.获取视频内容(加密)
当视频开始播放时,视频播放器会自动启动此步骤。 当视频播放器开始播放视频时,它会向点播CDN边缘节点请求视频数据文件。 对于HLS格式的视频,播放器将根据M3U8文件中的EXT-X-KEY标签获取视频解密密钥。 例如EXT-X-KEY标签中获取视频解密密钥的URL为:
https://getkey.example.com?fileId=123456&keySource=VodBuildInKMS&edk=abcdef
当玩家获得解密密钥DK时,会带上步骤1中App后台分配的域名。
4.获取视频解密密钥(带身份验证)
当播放器获取视频索引文件(M3U8文件)时,在播放视频文件之前会自动启动步骤4。
App后端收到客户端请求后,首先验证身份认证标识。 如果用户身份不合法,请求将被直接拒绝。 如果用户身份合法,则根据URL中携带的、、edk等参数从KMS系统获取DK并返回给客户端。 完成上述步骤后,客户端将获得视频解密密钥,可以进行正常的视频解密和播放。
常见问题
1. 加密HLS和普通HLS有什么区别?
根据HLS文档规范,HLS加密是对媒体文件(TS文件)进行加密,M3U8文件描述了播放器如何解密TS文件。 加密的 HLS M3U8 文件包含 EXT-X-KEY 标签,该标签参数包含 URI 属性。 该属性描述了加密算法,例如AES-128,URI属性描述了获取解密密钥的地址。 播放器可以通过访问该URI来获取解密后的密钥数据。 例如,URI 是:
http://www.test.com/getdk?fileId=123&edk=14cf
播放器解析M3U8文件时,会向该URI发起HTTP请求,并从返回包中获取关键数据。
2. 开通点播加密功能需要哪些信息?
要激活云点播加密功能,您需要在EXT-X-KEY标签中提供URI属性。 App服务器需要部署一个HTTP服务,用于获取客户端播放加密视频时的关键数据。 云点播服务对视频进行加密时,会将加密视频的M3U8文件的EXT-X-KEY标签的URI属性设置为。 为了获取密钥并方便管理,我们会附加三个参数,edk和.
阐明:
也就是视频ID,edk是加密密钥,是密钥来源,使用点播内置KMS系统的加密文件,是。 当玩家发起获取解密密钥的请求时,App服务器收到的HTTP请求中会包含和edk等参数。 App服务器可以根据和edk等参数,向玩家返回对应的DK。
3、播放器在播放加密视频时从哪里获取解密密钥?
播放器播放加密视频时,根据M3U8文件中EXT-X-KEY的URI发起获取密钥的请求,该URI是App向云端点播视频提供的地址。
注意:
播放器不向点播服务器发起获取密钥的请求。 App服务器调用点播接口进行加密时,加密完成后会调用获取视频解密密钥接口。 获得密钥后,需要保存密钥。 当玩家请求密钥时,会根据玩家的请求参数返回密钥。 对应的键。
4、App服务器如何处理从云端点播获取的关键数据?
当玩家向App服务器发起密钥获取请求时,App服务器需要向玩家返回相应的密钥数据。 返回的密钥数据是16字节的二进制数据。 密钥是通过获取视频解密密钥API得到的编码字符串。 该字符串返回给播放器时需要转换为二进制数据。 例如,对于编码的关键数据:
爪哇
import java.util.Base64;byte[] dkBin = Base64.getDecoder().decode(dkData);
PHP
$dkBin = base64_decode($dkData);