所有文档

          内容分发网络 CDN

          高级鉴权

          概述

          CDN加速节点和客户源站配合实现的资源防盗方法,可根据业务需要选择不同的鉴权方式对URL进行加密,实现对源站资源的保护。

          应用场景

          为防止客户源站内容被盗用,CDN提供防盗链功能,客户可通过配置Referer和IP的黑白名单来保护源站资源。然而由于Referer内容可被伪造,实际使用中仍存在盗链的隐患。为了更好地保护源站资源,CDN支持加密源站URL的功能,通过鉴权的方式来正确响应合法请求、拒绝非法请求。

          原理说明

          URL高级鉴权是百度智能云CDN加速节点和客户源站配合实现的一种更加安全可靠的源站资源防盗方法。

          1. CDN客户提供加密URL给客户端
          2. 客户端使用加密URL对CDN节点发起请求
          3. CDN加速节点验证加密URL的权限信息以判断请求的合法性。请求合法时正常响应,请求不合法时拒绝请求,以保护源站资源。

          URL鉴权方式

          百度智能云CDN支持A类、B类、C类三种鉴权方式,用户可以根据业务需要选择不同的鉴权方式对URL进行加密,实现对源站资源的保护。

          A类鉴权方式

          原理说明

          原始URL: http://Domain/Filename

          加密URL: http://Domain/Filename?auth_key=Timestamp-Rand-Uid-Md5hash

          加密URL字段解释

          字段 描述
          Domain CDN客户站点的域名
          Filename 实际回源访问的URL,鉴权时Filename需以/开头
          Timestamp 加密URL失效时间,整形正数,值为1970年1月1日至失效时间之间秒数。可为10进制或16进制,需与控制台配置一致。
          Rand 随机数,不能包含中划线-
          Uid userId,不能包含中划线-
          Md5hash 通过md5算法计算出来的验证串,数字0-9和小写英文字母a-z混合组成,固定长度32。值为md5sum(sstring),其中sstring="Filename-Timestamp-Rand-Uid-Key",Key可以为主KEY或者备KEY

          CDN服务器接收到请求后,会执行如下校验。

          1.解析请求中Timestamp,如果Timestamp小于当前时间,则认为加密URL过期,响应HTTP 403错误。

          1. 以sstring方式构造出一个字符串。然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。

          示例说明

          1. 原始URL:http://opencdn.example.com/authentication/test/2F.html
          2. 设置密钥:bdcloud666(由用户自行设置)。
          3. 客户设置加密URL失效日期为:2017年6月30日00:00:00,即计算出来的秒数为1498752000;rand设置为"0",uid设置为"0"。
          4. 客户拼接出sstring:"/authentication/test/2F.html-1498752000-0-0-bdcloud666"
          5. 根据sstring字符串计算md5hash = md5sum("/authentication/test/2F.html-1498752000-0-0-bdcloud666") = 89518343a306f93173783a260bb364f0
          6. 生成加密URL为:http://opencdn.example.com/authentication/test/2F.html?auth_key=1498752000-0-0-89518343a306f93173783a260bb364f0
          7. 客户端使用加密URL访问CDN节点,CDN节点对Timestamp和Md5hash进行校验,校验通过则返回文件,否则鉴权失败返回HTTP 403错误。

          API配置示例

          "anti_hot_link":{"antiType": "typeA", "secretKey": "bdcloud666", "newsecretKey": "opencdn666","secureFile": "/test.txt"}

          B类鉴权方式

          原理说明

          原始URL: http://Domain/Filename

          加密URL: http://Domain/Timestamp/Md5hash/FileName

          加密URL字段解释

          字段 描述
          Domain CDN客户站点的域名
          Timestamp 时间戳,格式可以为10进制、16进制或格式为YYYYMMDDHHMM,其中格式是10进制和16进制表示的是1970年1月1日至时间戳之间秒数,格式需与控制台配置一致。时间戳 + 有效时间(控制台配置)即为加密URL过期时间。例如有效时间配置成1800s,时间戳设置成201706301000,那么加密URL在2017-06-30 10:30:00之后失效。
          Md5hash 通过md5算法计算出来的验证串,数字0-9和小写英文字母a-z混合组成,固定长度32。值为md5sum(sstring),其中sstring="KeyTimestampFilename",Key可以为主KEY或者备KEY
          Filename 实际回源访问的URL,鉴权时Filename需以/开头。

          CDN服务器接收到请求后,会执行如下校验。

          1. 解析请求中Timestamp,如果(Timestamp + 有效时间)小于当前时间,则认为加密URL过期,响应HTTP 403错误。
          2. 构造sstring(sstring="KeyTimestampFilename",Key可以为主KEY或者备KEY),然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。

          示例说明

          1. 原始URL:http://opencdn.example.com/4/44/obhqonkjtlhquiy93.mp3
          2. 设置密钥:bdcloud666(由用户自行设置)。
          3. 设置有效时间:1800s(由用户自行设置)
          4. 设置timestamp为201706301000(格式为YYYYMMDDHHMM),即:2017年6月30日10:00:00
          5. 客户拼接出sstring:"bdcloud666201706301000/4/44/obhqonkjtlhquiy93.mp3"
          6. 根据sstring字符串计算md5hash = md5sum("bdcloud666201706301000/4/44/obhqonkjtlhquiy93.mp3") = c13e51c58f41084ac98bd9feeeb1a346
          7. 生成加密URL为:http://opencdn.example.com/201706301000/c13e51c58f41084ac98bd9feeeb1a346/4/44/ obhqonkjtlhquiy93.mp3
          8. 客户端使用加密URL访问CDN节点,CDN节点对Timestamp和Md5hash进行校验,校验通过则返回文件,否则鉴权失败返回HTTP 403错误。

          API配置示例

          "anti_hot_link":{"antiType": "typeB", "secretKey": "bdcloud666", "newsecretKey": "opencdn666","secureFile": "/test.txt", "timeout": 1800} 

          C类鉴权方式

          原理说明

          原始URL: http://Domain/Filename

          加密URL格式一: http://Domain/Md5hash/Timestamp/FileName

          加密URL格式二: http://Domain/FileName?md5hash=Md5hash&timestamp=Timestamp

          加密URL字段解释

          字段 描述
          Domain CDN客户站点的域名
          Md5hash 通过md5算法计算出来的验证串,数字0-9和小写英文字母a-z混合组成,固定长度32。值为md5sum(sstring),其中sstring="KeyFilenameTimestamp",Key可以为主KEY或者备KEY
          Timestamp 时间戳,格式可以为10进制、16进制,表示的是1970年1月1日至时间戳之间秒数。格式需与控制台配置一致。时间戳 + 有效时间(控制台配置)即为加密URL过期时间。例如有效时间配置成1800s,时间戳设置成201706301000,那么加密URL在2017-06-30 10:30:00之后失效。
          Filename 实际回源访问的URL,鉴权时Filename需以/开头。

          CDN服务器接收到请求后,会执行如下校验。

          1. 解析请求中Timestamp,如果(Timestamp + 有效时间)小于当前时间,则认为加密URL过期,响应HTTP 403错误。
          2. 构造sstring(sstring="KeyFilenameTimestamp",Key可以为主KEY或者备KEY),然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。

          示例说明

          1. 原始URL:http://opencdn.example.com/test.flv
          2. 设置密钥:bdcloud666(由用户自行设置)。
          3. 设置有效时间:1800s(由用户自行设置)
          4. 客户设置timestamp为5955b0a0(格式为16进制),即:2017年6月30日10:00:00
          5. 客户拼接出sstring:"bdcloud666/test.flv5955b0a0"
          6. 根据sstring字符串计算md5hash = md5sum("bdcloud666/test.flv5955b0a0") = 34f55132617957ab98d86c4342a1f394。
          7. 生成加密URL为:

            • 格式一: http://opencdn.example.com/34f55132617957ab98d86c4342a1f394/5955b0a0/test.flv
            • 格式二: http://opencdn.example.com/test.flv?md5hash=34f55132617957ab98d86c4342a1f394&timestamp=5955b0a0
          8. 客户端使用任一格式加密URL访问CDN节点,CDN节点对Timestamp和Md5hash进行校验,校验通过则返回文件,否则鉴权失败返回HTTP 403错误。

          配置URL鉴权

          1. 登录CDN管理控制台,进入“内容分发网络CDN”页面。
          2. 在左侧导航栏,点击域名管理
          3. 进入域名管理页面,点击目标域名操作列的管理
          4. 进入“CDN域名详情”页,在页面上方导航栏选择访问控制页签。
          5. 进入访问控制页面,点击高级鉴权设置模块的编辑
          6. 选择开启鉴权配置,配置以下参数:
          参数说明
          类型选择鉴权类型有三种,分别为A类鉴权、href="https://cloud.baidu.com/doc/CDN/s/ujwvyeo0t#b类鉴权方式" target="_blank" rel="noopener">B类鉴权和href="https://cloud.baidu.com/doc/CDN/s/ujwvyeo0t#c类鉴权方式" target="_blank" rel="noopener">C类鉴权,请根据需要选择。
          主KEY / 备KEY
          • 鉴权KEY包含主KEY和备KEY,主KEY必须设置,通过此KEY生成加密URL来限制用户访问。
          • 当需要替换密钥时,若需要新旧密钥同时生效,可设置备KEY。
          • 主、备KEY之一鉴权通过即可正常访问。备KEY不强制填写,格式与主KEY相同。
          • KEY的格式为大小写字母、数字,长度6到32。
          时间格式可选择十六进制十进制
          有效时间用户设置的加密URL的有效时间,用以生成鉴权URL,以s(秒)为单位,时间范围0~100000000整数。

          image.png

          1. 点击保存后,在高级鉴权模块可以看到鉴权配置成功,页面提示“配置已更新成功,大约五分钟生效”。

          说明:

          • 高级防盗链功能开启后,可根据用户设置的鉴权Key对URL进行加密,保护客户源站资源。
          • 鉴权计算器可以根据选择的类型以及输入的参数生成鉴权URL,用户可以通过鉴权计算器知晓配置结果并验证是否生效。

          CDN 三种高级鉴权 PHP 代码

          CDN提供了以下三种高级鉴权的 PHP Demo。

          CDN在鉴权错误时,会给客户端返回403响应码,并在响应头里提示鉴权错误的类型,如:X-Error-Info: typeA

          A类鉴权方式

          function demoA(){
          $time = strtotime("+3 hours");
          
          $key = "key1234";
          $domain = "http://test.cdn.bce.com";
          $filename = "/dir/index.html";
          
          //$sstring = "$filename-$time-$rand-$uid-$key"
          $sstring = $filename."-".$time."-0-0-".$key;
          $md5 = md5($sstring);
          $auth_key = "auth_key=".$time."-0-0-".$md5;
          $url = $domain.$filename."?".$auth_key;
          
          // echo "md5_src_string: \t".$sstring."\n";
          echo "request_url: \t\t".$url."\n";
          }

          B类鉴权方式

          function demoB(){
          $dt = new DateTime("now", new DateTimeZone('Asia/Chongqing'));
          $time = $dt->format("YmdHi");
          
          $key = "key1234";
          $domain = "http://test.cdn.bce.com";
          $filename = "/dir/index.html";
          
          //$sstring = "$key$time$filename"
          $sstring = $key.$time.$filename;
          $md5 = md5($sstring);
          $url = $domain."/".$time."/".$md5.$filename;
          
          // echo "md5_src_string: \t".$sstring."\n";
          echo "request_url: \t\t".$url."\n";
          }

          C类鉴权方式

          function demoC(){
          $time = dechex(time());
          
          $key = "key1234";
          $domain = "http://test.cdn.bce.com";
          $filename = "/dir/index.html";
          
          //$sstring = "$key$filename$time"
          $sstring = $key.$filename.$time;
          $md5 = md5($sstring);
          $url1 = $domain."/".$md5."/".$time.$filename;
          $url2 = $domain.$filename."?md5hash=".$md5."&timestamp=".$time;
          
          // echo "md5_src_string: \t".$sstring."\n";
          echo "request_url type1: \t".$url1."\n";
          echo "request_url type2: \t".$url2."\n";
          }
          上一篇
          设置防盗链
          下一篇
          设置跨域访问