Key防盗链
使用Referer防盗链可以对访问者的身份进行过滤,但Referer内容是可伪造的,无法彻底保障点播资源的安全。所以视频点播还提供了Key防盗链功能,用户可以自行配置Key值,并生成对应的播放URL,且该链接有一定的时效性,从而有效地保障了用户上传到点播服务上的资源不被非法盗用。
实现原理
Referer防盗链的实现原理比较简单,在点播控制台配置了白名单或黑名单后,点播服务会将这份名单分发到CDN中。当CDN接收到资源请求时,会根据这个名单来识别请求是否合法,若合法,则访问请求的资源,否则拒绝并返回403。
Key防盗链是视频点播的加速节点与点播源站联合实现的,比Referer防盗链更为安全可靠的一种防盗播方案。Key防盗链的实现过程如图1所示。
流程说明如下所示:
- 租户在点播控制台开启Key防盗链功能,并配置误差允许时间、算法等。
- 点播服务将配置的密钥值等下发到CDN节点中。
- 租户通过点播服务获取到点播媒资的鉴权URL。
- 观众通过租户提供的鉴权播放URL向CDN请求视频播放。
- CDN根据播放URL中携带的鉴权信息校验请求的合法性,仅校验通过的请求会被允许。
注意事项
- 该功能为可选项,默认不启用。
- 启用该功能后,原始视频加速URL将无法播放,需要按规则生成合法的防盗链URL。
- 若防盗链URL过期,或者签名不能通过,将无法播放视频,并返回“403 Forbidden”信息。
- 加密算法ABC暂不支持HLS和DASH播放场景。
- Key防盗链功能启用后,若需要关闭,请提交工单申请。
- 开启Key防盗链场景下,暂不支持多音轨和多字幕的播放请求。所以开启防盗链配置时,需要确认业务场景是否涉及多音轨和多字幕。
配置步骤
- 登录视频点播控制台。
- 在左侧导航栏中,选择“域名管理”,进入域名管理界面。
- 单击域名右侧“配置”,选择“防盗链配置”页签。
- 单击“Key防盗链”板块,弹出“Key防盗链”对话框。
- 请您按照实际需求配置Key防盗链参数,参数说明如表1所示。
图2 配置Key防盗链
表1 参数说明 参数
说明
密钥值
即Key值,单击“生成”,可自动生成符合格式的密钥值。
误差允许时间
表示当前防盗链有效时间,默认为120分钟。
示例:若鉴权URL生成时间为1573806090(2019/11/15 16:21:30),配置的“误差允许时间”为120分钟,则鉴权URL的失效时间为2019/11/15 18:21:30。
旧key的失效时间
采用新Key时,旧Key值的失效时间,从新Key生效时开始计算,默认60分钟后失效。
示例:若新Key生效时间为2019/11/15 16:21:30,配置的“旧Key的失效时间”为60分钟,则旧鉴权URL的真正失效时间为2019/11/15 17:21:30。
算法
Key值加密算法,支持如下四种算法:
ABC算法:采用MD5信息摘要算法,具体实现方法请参见加密算法A、加密算法B和加密算法C。
D算法:采用对称加密算法,具体实现方法请参见加密算法D。
E算法:采用Share256算法,具体实现方式请参见加密算法E(同CDN服务加密算法C2)。请注意:目前界面可以正常展示E算法,但功能暂未开放使用,请用户知晓。
说明:- 算法ABC暂不支持HLS和DASH播放场景,建议使用算法D或算法E。
- 算法E目前仅支持HLS和MP4类型文件开启试看功能。MP4文件的试看功能,需要其封装格式moov在mdat前面时,才能生效。开启试看功能后,可以从点播控制台获取播放链接,默认试看时长为300s。
鉴权范围
指定哪些文件参与鉴权。目前仅支持选择:所有文件、指定文件后缀鉴权、指定文件后缀不鉴权。
鉴权继承配置
为M3U8/MPD索引文件下的TS/MP4文件添加鉴权参数,解决因鉴权不通过导致的TS/MP4文件无法播放的问题。
说明:- 如果嵌套多层M3U8/MPD文件,仅解析第一层M3U8/MPD文件,不展开嵌套M3U8/MPD文件的TS/MP4流。
- 支持标准M3U8格式(按行解析:解析不成功时返回原值,支持以标签#EXT-X-MAP开头的URI,支持以非#开头的URL/URI)。
- 支持标准MPD格式(按行解析:解析不成功时返回原值,识别标签<BaseURL></BaseURL>之间的URI,不支持标签SegmentTemplate)。
试看开关
当前仅支持HLS和MP4类型文件试看功能。
- 单击“确定”,完成参数配置。
- 若您选择使用算法D,则参数配置完成后还需要提交工单申请审核,提交的信息需包含配置的域名,及表1中的信息。
审核通过后Key防盗链功能才会生效。若后续修改了此Key防盗链配置,需要重新提交工单审核。
- 验证Key防盗链生效是否生效。
获取对应的鉴权播放地址,并使用该地址进行播放,若播放成功,则表示Key防盗链配置生效。
生成鉴权URL
控制台获取
- 登录视频点播控制台。
- 在左侧导航栏中,选择“媒资管理 > 音视频管理”,进入音视频管理界面。
- 在对应的音视频行单击
,选择“播放地址”,进入播放地址展示页面。
其中
列为音视频的原始地址,单击即可获取鉴权URL。图3 播放地址
加密算法A
鉴权URL格式
原始URL?auth_key={timestamp}-{rand}-{uid}-{auth_key}
auth_key = MD5(/asset/{assetId}/{file_name}-{timestamp}-{rand}-{uid}-{private_key})
字段 |
描述 |
---|---|
timestamp |
鉴权URL生成时间,为Unix时间戳,1970年1月1日以来的秒数。 示例:1564731935(即2019.08.02 15:45) |
rand |
随机数,建议使用UUID方式生成,不能包含中划线”-“。 示例:f03cbe7c4a3849bc8d8769e3110e4533 |
uid |
暂未使用,直接设置成0即可。 |
private_key |
在控制台设置的防盗链Key值,具体请参见配置步骤。 |
原始URL:http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4 private_key:myPrivateKey timestamp:1547123166 rand:477b3bbc253f467b8def6711128c7bec uid:0
auth_key = md5(/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4-1547123166-477b3bbc253f467b8def6711128c7bec-0-myPrivateKey) = 584883719a3f722bf1a32a3b0a4d25dd
最终得到算法A的鉴权URL
http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4?auth_key=1547123166-477b3bbc253f467b8def6711128c7bec-0-584883719a3f722bf1a32a3b0a4d25dd
加密算法B
https://{cdn_domain}/{date_YYYYmmddHHMM}/{md5sum}/asset/{asset_id}/{file_name}
md5sum = md5({private_key}{date_yyyyMMddHHmm}/asset/{asset_id}/{file_name})
字段 |
描述 |
---|---|
date_yyyyMMddHHmm |
鉴权URL生成时间,格式为:yyyyMMddHHmm。 示例:201908051445 |
file_name |
指原始播放URL中从媒资ID后开始到最后的路径。 示例:play_video/test.mp4 |
private_key |
在控制台设置的防盗链Key值,具体请参见配置步骤。 |
原始URL:http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4 private_key:myPrivateKey date_yyyyMMddHHmm:201901102026 file_name:test.mp4
则根据计算公式,得到md5sum
md5sum = md5(myPrivateKey201901102026/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4) = 713ef643de8df076da6ec3c0545968cb
最终得到算法B的鉴权URL
http://1.cdn.myhuaweicloud.com/201901102026/713ef643de8df076da6ec3c0545968cb/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4
加密算法C
https://{cdn_domain}/{md5hash}/{time_hex}/asset/{asset_id}/{file_name}
md5hash = md5({private_key}/asset/{asset_id}/{file_name}{time_hex})
字段 |
描述 |
---|---|
file_name |
指原始播放URL中从媒资ID后开始到最后的路径。 示例:play_video/test.mp4 |
time_hex |
鉴权URL生成时间,为Unix时间戳的十六进制结果。 示例:hex(1564987530)=5D47D08A |
private_key |
在控制台设置的防盗链Key值,具体请参见配置步骤。 |
原始URL:http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4 private_key:myPrivateKey time_hex:hex(timestamp) = hex(1547123166) = 5C3739DE file_name:test.mp4
md5hash=md5(myPrivateKey/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp45C3739DE) = afa20c956043fe6d130b16f2704ac870
最终得到算法C的鉴权URL
http://1.cdn.myhuaweicloud.com/afa20c956043fe6d130b16f2704ac870/5C3739DE/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4
加密算法D
鉴权URL格式
原始URL?auth_info={加密串}.{EncodedIV}&plive={plive_starttime}
- 加密原始串 = url_encoding({path}+"$"+{Timestamp})+"$"+{plive_starttime}
- 加密串 = aes_cbc_128_pkcs5padding(原始加密串,key,IV)
- EncodedIV = hex(IV)
字段 |
描述 |
---|---|
path |
指从域名开始,到最后一层目录,包括域名后的“/”,也包含最后一层目录后的“/”,不包括文件名。 示例:/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/ |
Timestamp |
鉴权URL生成时间,UTC时间,格式为yyyyMMddHHmmss,用于检查鉴权参数是否过期。 示例:20190805101025 |
key |
在控制台设置的防盗链Key值,具体请参见配置步骤。 |
plive(可选) |
伪直播开始时间,取值为UTC时间。 需要伪直播时,才配置此参数,否则不需要此参数参与鉴权URL的计算。伪直播详情请参考伪直播。 |
IV |
随机生成的bytes数组,长度为16。 hex():将bytes数组转换成十六进制的字符串。
生成IV生成示例代码如下所示:
byte[] iv = new byte[16]; SecureRandom secureRand = new SecureRandom(); secureRand.nextBytes(iv); |
原始URL:https://179.cdn-vod.huaweicloud.com/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/index.m3u8 path:/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/ key:8Ks1qn14XRO28qOa Timestamp:20190805102430 plive:1704074400
原始加密串 = url_encoding("/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/") + "$" + "20190805102430"+ "$" + "1704074400" 加密串 = aes_cbc_128_pkcs5padding(原始加密串,key,IV) = 34M%2F6KtYgxuAozdBLIVTe0dUVAZdvXsYQoYAnDmuhRHh1hshYg%2B2Tl0AmSwySDh%2BmkER44qYKpSP%2BgfsLM%2FIZe4F6K4n1Nx6ouGwyKfqdDA%3D EncodedIV = hex(IV) = 79436d453636364e335941713330534e
https://179.cdn-vod.huaweicloud.com/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/index.m3u8?auth_info=34M%2F6KtYgxuAozdBLIVTe0dUVAZdvXsYQoYAnDmuhRHh1hshYg%2B2Tl0AmSwySDh%2BmkER44qYKpSP%2BgfsLM%2FIZe4F6K4n1Nx6ouGwyKfqdDA%3D.79436d453636364e335941713330534e&plive=1704074400
加密算法E
- 目前界面可以正常展示E算法,但功能暂未开放使用,请用户知晓。
- 不能同时开启试看和伪直播功能。下述URL仅供参考,exper和plive不能同时存在。
鉴权URL格式
原始URL?auth_key={authKey}×tamp={timestamp}&exper={exper}&plive={plive_starttime}
authKey的计算公式如下所示:
- 开启试看功能:auth_key = sha256({PrivateKey }{fileName}{timestamp}{exper}
- 开启伪直播功能:auth_key = sha256({PrivateKey }{fileName}{timestamp}{plive_starttime})
表6 鉴权字段描述 字段
描述
timestamp
鉴权URL生成时间,为Unix时间戳,即1970年1月1日以来的秒数。单位:秒。
示例:1564731935。即时间为:2019.08.02 15:45。
fileName
实际回源访问的URL,鉴权时filename需以“/”开头,且不能包含鉴权URL中“?”后面的参数。
如:/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls
PrivateKey
用户设定的鉴权密钥,用于生成加密URL。
密钥的格式为大小写字母和数字,长度为16到32位字符。
exper(可选)
视频试看时长,取值为数字,单位:秒。仅支持MP4和HLS格式。
需要试看时,才配置此参数,否则不需要此参数参与鉴权URL的计算。
plive(可选)
伪直播开始时间,取值为UTC时间。仅支持HLS格式。
需要伪直播时,才配置此参数,否则不需要此参数参与鉴权URL的计算。不能同时开启试看和伪直播功能。伪直播详情请参考伪直播。
原始URL:http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls private_key:32d6b2d740f10b86 timestamp:1547123166 fileName:/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls exper:300 plive:1704074400
- 开启试看功能
auth_key = sha256(32d6b2d740f10b86/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls1547123166300) = 3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768
- 开启伪直播功能
auth_key = sha256(32d6b2d740f10b86/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls15471231661704074400) = 3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768
- 支持试看功能
http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls?auth_key=3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768×tamp=1547123166&exper=300
- 支持伪直播功能
http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls?auth_key=3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768×tamp=1547123166&plive=1704074400