更新时间:2024-10-28 GMT+08:00

Key防盗链

使用Referer防盗链可以对访问者的身份进行过滤,但Referer内容是可伪造的,无法彻底保障点播资源的安全。所以视频点播还提供了Key防盗链功能,用户可以自行配置Key值,并生成对应的播放URL,且该链接有一定的时效性,从而有效地保障了用户上传到点播服务上的资源不被非法盗用。

实现原理

Referer防盗链的实现原理比较简单,在点播控制台配置了白名单或黑名单后,点播服务会将这份名单分发到CDN中。当CDN接收到资源请求时,会根据这个名单来识别请求是否合法,若合法,则访问请求的资源,否则拒绝并返回403。

Key防盗链是视频点播的加速节点与点播源站联合实现的,比Referer防盗链更为安全可靠的一种防盗播方案。Key防盗链的实现过程如图1所示。

图1 Key防盗链实现原理

流程说明如下所示:

  1. 租户在点播控制台开启Key防盗链功能,并配置误差允许时间、算法等。
  2. 点播服务将配置的密钥值等下发到CDN节点中。
  3. 租户通过点播服务获取到点播媒资的鉴权URL。
  4. 观众通过租户提供的鉴权播放URL向CDN请求视频播放。
  5. CDN根据播放URL中携带的鉴权信息校验请求的合法性,仅校验通过的请求会被允许。

注意事项

  • 该功能为可选项,默认不启用。
  • 启用该功能后,原始视频加速URL将无法播放,需要按规则生成合法的防盗链URL。
  • 若防盗链URL过期,或者签名不能通过,将无法播放视频,并返回“403 Forbidden”信息。
  • 加密算法ABC暂不支持HLS和DASH播放场景。
  • Key防盗链功能启用后,若需要关闭,请提交工单申请。
  • 开启Key防盗链场景下,暂不支持多音轨和多字幕的播放请求。所以开启防盗链配置时,需要确认业务场景是否涉及多音轨和多字幕。

配置步骤

  1. 登录视频点播控制台
  2. 在左侧导航栏中,选择“域名管理”,进入域名管理界面。
  3. 单击域名右侧“配置”,选择“防盗链配置”页签。
  4. 单击“Key防盗链”板块,弹出“Key防盗链”对话框。
  5. 请您按照实际需求配置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类型文件试看功能。

  6. 单击“确定”,完成参数配置。
  7. 若您选择使用算法D,则参数配置完成后还需要提交工单申请审核,提交的信息需包含配置的域名,及表1中的信息。

    审核通过后Key防盗链功能才会生效。若后续修改了此Key防盗链配置,需要重新提交工单审核。

  8. 验证Key防盗链生效是否生效。

    获取对应的鉴权播放地址,并使用该地址进行播放,若播放成功,则表示Key防盗链配置生效。

生成鉴权URL

控制台获取

  1. 登录视频点播控制台
  2. 在左侧导航栏中,选择“媒资管理 > 音视频管理”,进入音视频管理界面。
  3. 在对应的音视频行单击管理,选择“播放地址”,进入播放地址展示页面。

    其中地址列为音视频的原始地址,单击即可获取鉴权URL。

    图3 播放地址

加密算法A

鉴权URL格式

原始URL?auth_key={timestamp}-{rand}-{uid}-{auth_key}
auth_key的计算公式:
auth_key = MD5(/asset/{assetId}/{file_name}-{timestamp}-{rand}-{uid}-{private_key})
表2 鉴权字段描述

字段

描述

timestamp

鉴权URL生成时间,为Unix时间戳,1970年1月1日以来的秒数。

示例:1564731935(即2019.08.02 15:45)

rand

随机数,建议使用UUID方式生成,不能包含中划线”-“。

示例:f03cbe7c4a3849bc8d8769e3110e4533

uid

暂未使用,直接设置成0即可。

private_key

在控制台设置的防盗链Key值,具体请参见配置步骤

鉴权URL示例
原始URL:http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4
private_key:myPrivateKey
timestamp:1547123166
rand:477b3bbc253f467b8def6711128c7bec
uid:0
则根据计算公式,得到auth_key
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

鉴权URL格式
https://{cdn_domain}/{date_YYYYmmddHHMM}/{md5sum}/asset/{asset_id}/{file_name}
md5sum的计算公式:
md5sum = md5({private_key}{date_yyyyMMddHHmm}/asset/{asset_id}/{file_name})
表3 鉴权字段描述

字段

描述

date_yyyyMMddHHmm

鉴权URL生成时间,格式为:yyyyMMddHHmm。

示例:201908051445

file_name

指原始播放URL中从媒资ID后开始到最后的路径。

示例:play_video/test.mp4

private_key

在控制台设置的防盗链Key值,具体请参见配置步骤

鉴权URL示例
原始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

鉴权URL格式
https://{cdn_domain}/{md5hash}/{time_hex}/asset/{asset_id}/{file_name}
md5hash的计算公式
md5hash = md5({private_key}/asset/{asset_id}/{file_name}{time_hex})
表4 鉴权字段描述

字段

描述

file_name

指原始播放URL中从媒资ID后开始到最后的路径。

示例:play_video/test.mp4

time_hex

鉴权URL生成时间,为Unix时间戳的十六进制结果。

示例:hex(1564987530)=5D47D08A

private_key

在控制台设置的防盗链Key值,具体请参见配置步骤

鉴权URL示例
原始URL:http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.mp4
private_key:myPrivateKey
time_hex:hex(timestamp) = hex(1547123166) = 5C3739DE
file_name:test.mp4
则根据计算公式,得到md5sum
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}
加密串EncodedIV的计算公式:
  • 加密原始串 = url_encoding({path}+"$"+{Timestamp})
  • 加密串 = aes_cbc_128_pkcs5padding(原始加密串,key,IV)
  • EncodedIV = hex(IV)
表5 鉴权字段描述

字段

描述

path

指从域名开始,到最后一层目录,包括域名后的“/”,也包含最后一层目录后的“/”,不包括文件名。

示例:/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/

Timestamp

鉴权URL生成时间,UTC时间,格式为yyyyMMddHHmmss,用于检查鉴权参数是否过期。

示例:20190805101025

key

在控制台设置的防盗链Key值,具体请参见配置步骤

IV

随机生成的bytes数组,长度为16。

hex():将bytes数组转换成十六进制的字符串。

生成IV生成示例代码如下所示:
byte[] iv = new byte[16];
SecureRandom secureRand = new SecureRandom();
secureRand.nextBytes(iv);
鉴权URL示例
原始URL:https://179.cdn-vod.huaweicloud.com/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/index.m3u8
path:/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/
key:8Ks1qn14XRO28qOa
Timestamp:20190805102430
则根据计算公式,得到加密串EncodedIV
原始加密串 = url_encoding("/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/") + "$" + "20190805102430"
加密串 = aes_cbc_128_pkcs5padding(原始加密串,key,IV) = 34M%2F6KtYgxuAozdBLIVTe0dUVAZdvXsYQoYAnDmuhRHh1hshYg%2B2Tl0AmSwySDh%2BmkER44qYKpSP%2BgfsLM%2FIZe4F6K4n1Nx6ouGwyKfqdDA%3D
EncodedIV = hex(IV) = 79436d453636364e335941713330534e
最终得到算法D的鉴权URL
https://179.cdn-vod.huaweicloud.com/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/index.m3u8?auth_info=34M%2F6KtYgxuAozdBLIVTe0dUVAZdvXsYQoYAnDmuhRHh1hshYg%2B2Tl0AmSwySDh%2BmkER44qYKpSP%2BgfsLM%2FIZe4F6K4n1Nx6ouGwyKfqdDA%3D.79436d453636364e335941713330534e

加密算法E

鉴权URL格式

原始URL?auth_key={authKey}&timestamp={timestamp}&exper={exper}

authKey的计算公式如下所示:

  • 开启试看功能:auth_key = sha256({PrivateKey }{fileName}{timestamp}{exper}
  • 表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的计算。

鉴权URL示例
原始URL:http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls
private_key:32d6b2d740f10b86
timestamp:1547123166
fileName:/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls
exper:300
则根据计算公式,得到auth_key,如下所示:
  • 开启试看功能
    auth_key = sha256(32d6b2d740f10b86/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls1547123166300) = 3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768
最终得到算法E的鉴权URL,如下所示:
  • 支持试看功能
    http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls?auth_key=3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768&timestamp=1547123166&exper=300