
# Key防盗链
使用Referer防盗链可以对访问者的身份进行过滤，但Referer内容是可伪造的，无法彻底保障点播资源的安全。所以视频点播还提供了Key防盗链功能，用户可以自行配置Key值，并生成对应的播放URL，且该链接有一定的时效性，从而有效地保障了用户上传到点播服务上的资源不被非法盗用。您可以参考如下步骤完成Key防盗链的配置，也可以通过[视频指导](https://bbs.huaweicloud.com/videos/a8464ac1a5e4474980f7b86559540994)来操作。
#### 实现原理
Referer防盗链的实现原理比较简单，在点播控制台配置了白名单或黑名单后，点播服务会将这份名单分发到CDN中。当CDN接收到资源请求时，会根据这个名单来识别请求是否合法，若合法，则访问请求的资源，否则拒绝并返回403。
Key防盗链是视频点播的加速节点与点播源站联合实现的，比Referer防盗链更为安全可靠的一种防盗播方案。Key防盗链的实现过程如[图1]所示。
图1Key防盗链实现原理   
![](https://support.huaweicloud.com/usermanual-vod/zh-cn_image_0192952726.png)
流程说明如下所示：
1. 租户在点播控制台开启Key防盗链功能，并配置误差允许时间、算法等。
2. 点播服务将配置的密钥值等下发到CDN节点中。
3. 租户通过点播服务获取到点播媒资的鉴权URL。
4. 观众通过租户提供的鉴权播放URL向CDN请求视频播放。
5. CDN根据播放URL中携带的鉴权信息校验请求的合法性，仅校验通过的请求会被允许。
 
#### 注意事项
- 该功能为可选项，默认不启用。
- 启用该功能后，原始视频加速URL将无法播放，需要按规则生成合法的防盗链URL。
- 若防盗链URL过期，或者签名不能通过，将无法播放视频，并返回"403 Forbidden"信息。
- 加密算法ABC不支持HLS和DASH播放场景，推荐使用加密算法E。
- 加密算法ABCD为不安全算法， 推荐使用加密算法E。
- 开启Key防盗链场景下，暂不支持多音轨和多字幕的播放请求。所以开启防盗链配置时，需要确认业务场景是否涉及多音轨和多字幕。
 
 #### 配置步骤
1. 登录[视频点播控制台](https://console.huaweicloud.com/vod2/#/vod/home)。
2. 在左侧导航栏中，选择"域名管理"，进入域名管理界面。
3. 单击域名右侧"配置"，选择"防盗链配置"页签，如[图2]所示。
   
   图2防盗链配置   
   ![](https://support.huaweicloud.com/usermanual-vod/zh-cn_image_0000002220625504.png)
   
   
4. 单击"Key防盗链"右侧的"编辑"，弹出"Key防盗链"对话框，如[图3]所示。
   
   开启防盗链开关后的参数说明如[表1]所示。
   图3配置Key防盗链   
   ![](https://support.huaweicloud.com/usermanual-vod/zh-cn_image_0000002489245196.png)
    表1参数说明 
   | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   |:---|:---|
   | 鉴权KEY    | 支持自定义输入，或单击右侧的"生成"，自动生成鉴权KEY值。 须知： - 建议自动生成，否则密钥随机性不够时，鉴权信息的安全性将无法保证。  - 设置完成后无法查询，请妥善保管，如果丢失请重新设置或[提交工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)查询。                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 鉴权KEY（备） | 支持自定义输入，或单击右侧的"生成"，自动生成备鉴权KEY值。 须知： - 建议自动生成，否则密钥随机性不够时，鉴权信息的安全性将无法保证。  - 设置完成后无法查询，请妥善保管，如果丢失请重新设置或[提交工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)查询。                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | 有效时间长度   | 表示当前防盗链有效时间，默认为120分钟。 示例：若鉴权URL生成时间为1573806090（2019/11/15 16:21:30），配置的"误差允许时间"为120分钟，则鉴权URL的失效时间为2019/11/15 18:21:30。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 算法       | Key值加密算法，支持如下四种算法： ABC算法：采用MD5信息摘要算法，具体实现方法请参见[加密算法A]、[加密算法B]和[加密算法C]。 D算法：采用对称加密算法，具体实现方法请参见[加密算法D]。 E算法：采用SHA256算法，具体实现方式请参见[加密算法E]（同CDN服务[加密算法C2](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0140.html)）。 说明： - 加密算法ABCD为不安全算法，推荐使用算法E。  - 算法ABC不支持HLS和DASH播放场景，推荐使用算法E。  - 如果修改防盗链配置，如切换算法、修改密钥等操作，建议验证生效后再分发使用。   |
   | 签名算法     | ABC算法新增支持SHA256，存量用户默认使用MD5。 须知： - ABC算法如需切换签名算法，鉴权URL生成需参考[生成鉴权URL的Demo](https://support.huaweicloud.com/ssdk-vod/vod_05_0081.html#section1)重新适配，否则将无法播放。  - MD5为不安全算法，不建议使用。                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 鉴权范围     | 指定哪些文件参与鉴权。目前仅支持选择：所有文件、指定文件后缀鉴权、指定文件后缀不鉴权。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 鉴权继承配置   | 为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类型文件试看功能。 说明： 目前仅算法DE支持试看功能，且算法DE目前仅支持HLS和MP4类型文件开启试看功能。MP4文件的试看功能，需要其封装格式moov在mdat前面时，才能生效。开启试看功能后，可以从点播控制台获取播放链接，默认试看时长为300s。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
      
   
   
5. 单击"确定"，完成参数配置。
6. 验证Key防盗链生效是否生效。 
   [获取对应的鉴权播放地址]，并使用该地址进行播放，若播放成功，则表示Key防盗链配置生效。
   
   
 
 #### 生成鉴权URL
**控制台获取** **方式**
1. 登录[视频点播控制台](https://console.huaweicloud.com/vod2/#/vod/home)。
2. 在左侧导航栏中，选择"媒资管理 \> 音视频管理"，进入音视频管理界面。
3. 在对应的音视频行单击"管理"，选择"播放地址"，进入播放地址展示页面。 
   其中"地址"列为音视频的原始地址，单击![](https://support.huaweicloud.com/usermanual-vod/zh-cn_image_0000001898378477.png)即可获取鉴权URL。
   图4播放地址   
   ![](https://support.huaweicloud.com/usermanual-vod/zh-cn_image_0215739329.png)
   
   
**SDK生成鉴权URL** **方式**
您也可以下载服务端SDK，通过Demo来生成媒资的鉴权URL，具体请参见[获取鉴权URL](https://support.huaweicloud.com/ssdk-vod/vod_05_0081.html#section1)代码示例。
 #### 加密算法A
**鉴权URL格式**
```
原始URL?auth_key={timestamp}-{rand}-{uid}-{auth_key}
```
**auth_key** 的计算公式：
```
auth_key = {MD5或SHA256}(/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
```
以MD5为例，则根据计算公式，得到**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}/{authStr}/asset/{asset_id}/{file_name}
```
**authStr** 的计算公式：
```
authStr = {MD5或SHA256}({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
```
以MD5为例，则根据计算公式，得到**authStr**
```
authStr = 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}/{authStr}/{time_hex}/asset/{asset_id}/{file_name}
```
**authStr** 的计算公式**：**
```
authStr = {MD5或SHA256}({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
```
以MD5为例，则根据计算公式，得到**authStr**
```
authStr=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}&exper={exper}&plive={plive_starttime}
```
**加密串** 和**EncodedIV** 的计算公式：
- 加密原始串：
  - **开启试看功能** ：加密原始串 = url_encoding({path})+"$"+{Timestamp}*+"$"+{exper}*
  
  - **开启伪直播功能** ：加密原始串 = url_encoding({path})+"$"+{Timestamp}*+"$"+{* *plive_starttime}*
   
- 加密串 = aes_cbc_128_pkcs5padding(原始加密串,key,IV)
- EncodedIV = hex(IV)
表5鉴权字段描述 
| 字段        | 描述                                                                                                                                                                                                                              |
|:---|:---|
| path      | 指从域名开始，到最后一层目录，包括域名后的"/"，也包含最后一层目录后的"/"，不包括文件名。 示例：/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/                                                                                              |
| Timestamp | 鉴权URL生成时间，UTC时间，格式为yyyyMMddHHmmss，用于检查鉴权参数是否过期。 示例：20190805101025                                                                                                                                    |
| key       | 在控制台设置的防盗链Key值，具体请参见[配置步骤]。                                                                                                                                                                      |
| exper（可选） | 视频试看时长，取值为数字，单位：秒。仅支持MP4和HLS格式，目前HLS不支持主索引试看，仅支持次级索引试看。 需要试看时，才配置此参数，否则不需要此参数参与鉴权URL的计算。不能同时开启试看和伪直播功能。                                                                                             |
| plive（可选） | 伪直播开始时间，取值为UTC时间。 需要伪直播时，才配置此参数，否则不需要此参数参与鉴权URL的计算。不能同时开启试看和伪直播功能。伪直播详情请参考[伪直播](https://support.huaweicloud.com/usermanual-vod/vod_01_0002.html)。                                                    |
| 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
exper：300
plive：1704074400
```
则根据计算公式，得到**加密串** 和**EncodedIV**
- 开启试看功能
  ```
  原始加密串 = url_encoding("/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/") + "$" + "20190805102430"+ "$" + "300"
  加密串 = aes_cbc_128_pkcs5padding(原始加密串,key,IV) = 34M%2F6KtYgxuAozdBLIVTe0dUVAZdvXsYQoYAnDmuhRHh1hshYg%2B2Tl0AmSwySDh%2BmkER44qYKpSP%2BgfsLM%2FIZe4F6K4n1Nx6ouGwyKfqdDA%3D
  EncodedIV = hex(IV) = 79436d453636364e335941713330534e
  ```
  
 
- 开启伪直播功能
  ```
  原始加密串 = 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
  ```
  
最终得到算法D的鉴权URL，如下所示：
- 开启试看功能
  ```
  https://179.cdn-vod.huaweicloud.com/asset/32237c8f68fcc6071a2d8e3421eee20d/play_video/index.m3u8?auth_info=34M%2F6KtYgxuAozdBLIVTe0dUVAZdvXsYQoYAnDmuhRHh1hshYg%2B2Tl0AmSwySDh%2BmkER44qYKpSP%2BgfsLM%2FIZe4F6K4n1Nx6ouGwyKfqdDA%3D.79436d453636364e335941713330534e&exper=300
  ```
  
 
- 开启伪直播功能
  ```
  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
![](https://support.huaweicloud.com/usermanual-vod/public_sys-resources/caution_3.0-zh-cn.png)
不能同时开启试看和伪直播功能。下述URL仅供参考，exper和plive不能同时存在。
**鉴权URL格式**
```
原始URL?auth_key={authKey}&timestamp={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格式，目前HLS不支持主索引试看，仅支持次级索引试看。 需要试看时，才配置此参数，否则不需要此参数参与鉴权URL的计算。不能同时开启试看和伪直播功能。                                                   |
  | plive（可选）  | 伪直播开始时间，取值为UTC时间。仅支持HLS格式。 需要伪直播时，才配置此参数，否则不需要此参数参与鉴权URL的计算。不能同时开启试看和伪直播功能。伪直播详情请参考[伪直播](https://support.huaweicloud.com/usermanual-vod/vod_01_0002.html)。 |
     
  
**鉴权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** ，如下所示：
- 开启试看功能
  ```
  auth_key = sha256(32d6b2d740f10b86/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls1547123166300) = 3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768
  ```
  
 
- 开启伪直播功能
  ```
  auth_key = sha256(32d6b2d740f10b86/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls15471231661704074400) = 3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768
  ```
  
最终得到算法E的鉴权URL，如下所示：
- 支持试看功能
  ```
  http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls?auth_key=3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768&timestamp=1547123166&exper=300
  ```
  
- 支持伪直播功能
  ```
  http://1.cdn.myhuaweicloud.com/asset/6b2d740f10b8697d8ea6672868ecdb6f/test.hls?auth_key=3a935cf1d8299fe63ec8d4e0afb5ef3304883a702a4e760f3c5ae838a4b69768&timestamp=1547123166&plive=1704074400
  ```
  
 
