高级鉴权
概述
CDN加速节点和客户源站配合实现的资源防盗方法,可根据业务需要选择不同的鉴权方式对URL进行加密,实现对源站资源的保护。
应用场景
为防止客户源站内容被盗用,CDN提供防盗链功能,客户可通过配置Referer和IP的黑白名单来保护源站资源。然而由于Referer内容可被伪造,实际使用中仍存在盗链的隐患。为了更好地保护源站资源,CDN支持加密源站URL的功能,通过鉴权的方式来正确响应合法请求、拒绝非法请求。
原理说明
URL高级鉴权是百度智能云CDN加速节点和客户源站配合实现的一种更加安全可靠的源站资源防盗方法。
- CDN客户提供加密URL给客户端。
- 客户端使用加密URL对CDN节点发起请求。
- 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时间戳,与鉴权有效时长共同决定鉴权URL失效时间,整形正数,值为1970年1月1日至签算URL时间的总秒数。可配置为10进制或16进制。鉴权URL有效时间由用户在控制台配置,默认为1800s,当访问CDN的时间超过Timestamp+鉴权URL有效时长后,该鉴权URL失效。例如,鉴权URL签算的时间为202011181400,控制台配置的有效时间为1800s,则链接的真正失效时间为2020-11-18 14:30:00。 |
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+鉴权Key有效时间之和小于当前时间,则认为加密URL过期,响应HTTP 403错误。
2.以sstring方式构造出一个字符串。然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。
示例说明
- 原始URL:
http://opencdn.example.com/authentication/test/2F.html
。 - 设置密钥:
bdcloud666
(由用户自行设置)。 - 客户设置加密URL失效日期为:2017年6月30日00:00:00,即计算出来的秒数为1498752000;rand设置为"0",uid设置为"0"。
- 客户拼接出sstring:"/authentication/test/2F.html-1498752000-0-0-bdcloud666"
- 根据sstring字符串计算md5hash = md5sum("/authentication/test/2F.html-1498752000-0-0-bdcloud666") = 89518343a306f93173783a260bb364f0
- 生成加密URL为:
http://opencdn.example.com/authentication/test/2F.html?auth_key=1498752000-0-0-89518343a306f93173783a260bb364f0
。 - 客户端使用加密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。时间戳 + 有效时间(控制台配置)即为加密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服务器接收到请求后,会执行如下校验。
- 解析请求中Timestamp,如果(Timestamp + 有效时间)小于当前时间,则认为加密URL过期,响应HTTP 403错误。
- 构造sstring(sstring="KeyTimestampFilename",Key可以为主KEY或者备KEY),然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。
示例说明
- 原始URL:
http://opencdn.example.com/4/44/obhqonkjtlhquiy93.mp3
。 - 设置密钥:
bdcloud666
(由用户自行设置)。 - 设置有效时间:1800s(由用户自行设置)
- 设置timestamp为201706301000(格式为YYYYMMDDHHMM),即:2017年6月30日10:00:00
- 客户拼接出sstring:"bdcloud666201706301000/4/44/obhqonkjtlhquiy93.mp3"
- 根据sstring字符串计算md5hash = md5sum("bdcloud666201706301000/4/44/obhqonkjtlhquiy93.mp3") = c13e51c58f41084ac98bd9feeeb1a346
- 生成加密URL为:
http://opencdn.example.com/201706301000/c13e51c58f41084ac98bd9feeeb1a346/4/44/obhqonkjtlhquiy93.mp3
。 - 客户端使用加密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×tamp=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服务器接收到请求后,会执行如下校验。
- 解析请求中Timestamp,如果(Timestamp + 有效时间)小于当前时间,则认为加密URL过期,响应HTTP 403错误。
- 构造sstring(sstring="KeyFilenameTimestamp",Key可以为主KEY或者备KEY),然后使用md5算法算出HashValue,并与客户端请求中带来的Md5hash进行对比。如果一致则认为鉴权通过并返回文件,否则鉴权失败返回HTTP 403错误。
示例说明
- 原始URL:
http://opencdn.example.com/test.flv
。 - 设置密钥:
bdcloud666
(由用户自行设置)。 - 设置有效时间:1800s(由用户自行设置)
- 客户设置timestamp为5955b0a0(格式为16进制),即:2017年6月30日10:00:00
- 客户拼接出sstring:"bdcloud666/test.flv5955b0a0"
- 根据sstring字符串计算md5hash = md5sum("bdcloud666/test.flv5955b0a0") = 34f55132617957ab98d86c4342a1f394。
-
生成加密URL为:
- 格式一:
http://opencdn.example.com/34f55132617957ab98d86c4342a1f394/5955b0a0/test.flv
。 - 格式二:
http://opencdn.example.com/test.flv?md5hash=34f55132617957ab98d86c4342a1f394×tamp=5955b0a0
。
- 格式一:
- 客户端使用任一格式加密URL访问CDN节点,CDN节点对Timestamp和Md5hash进行校验,校验通过则返回文件,否则鉴权失败返回HTTP 403错误。
配置URL鉴权
- 登录CDN管理控制台,进入“内容分发网络CDN”页面。
- 在左侧导航栏,点击域名管理。
- 进入域名管理页面,点击目标域名操作列的管理。
- 进入“CDN域名详情”页,在页面上方导航栏选择访问控制页签。
- 进入访问控制页面,点击高级鉴权设置模块的编辑。
- 选择开启鉴权配置,配置以下参数:
参数 | 说明 |
---|---|
类型选择 | 鉴权类型有三种,分别为A类鉴权、B类鉴权和C类鉴权,请根据需要选择。 |
主KEY / 备KEY |
|
时间格式 | 可选择十六进制或十进制。 |
有效时间 | 用户设置的加密URL的有效时间,用以生成鉴权URL,以s(秒)为单位,时间范围0~100000000整数。 |
- 点击保存后,在高级鉴权模块可以看到鉴权配置成功,页面提示“配置已更新成功,大约五分钟生效”。
说明:
- 高级防盗链功能开启后,可根据用户设置的鉴权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."×tamp=".$time;
// echo "md5_src_string: \t".$sstring."\n";
echo "request_url type1: \t".$url1."\n";
echo "request_url type2: \t".$url2."\n";
}