数字版权管理(Digital Rights Management,DRM),对于在线教育、行业培训等领域都是十分重要的。视频文件的泄露,有可能造成十分严重的经济损失。
传统的视频服务提供商大多是通过各种各样的防盗链机制来实现视频内容保护。该方案的基本原理是:App 服务端给客户派发专属的视频 URL,CDN 服务对请求 URL、请求 IP、HTTP 头等参数进行校验,如果校验通过,则返回正常的视频数据;否则返回 403 错误码。
但是,对于需要付费观看的视频,一旦恶意用户通过一次付费行为拿到了合法的防盗链播放 URL,其便可以将视频完整下载到本地,进而实现二次分发。因此,防盗链方案对于视频版权保护是远远不够的。要进一步提升视频内容的保护程度,就不能仅仅在视频的分发环节做文章,而是必须对视频数据本身的加密。对视频数据加密之后,即使恶意用户把视频下载到本地,视频本身也是被加密的,这样就提高了恶意用户将视频内容二次分发的门槛。
为支持视频播放的权限控制,推出了防盗链的解决方案。开通防盗链后, CDN 节点将对播放请求中的关键信息进行检查,并对通过检查的请求返回视频数据。
一般的点播防盗链支持 Referer 防盗链和 Key 防盗链两种类型。Key 防盗链在不同的平台又称为URL鉴权或TOKEN防盗链,基本机制一样。
http://
和 https://
),域名为前缀匹配(填写 abc.com
,则 abc.com/123
和 abc.com.cn
也会匹配),且支持通配符(*.abc.com)
。
视频的防盗链 URL 的生成规则是在原始 URL 后以 QueryString 的方式加入防盗链参数,形如:
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=[t]&exper=[exper]&rlimit=[rlimit]&us=[us]&sign=[sign]
QueryString 中的防盗链参数必须按照t
,exper
,rlimit
,us
,sign
的顺序拼接,下面详细介绍防盗链 URL 中各个参数的含义和取值方法。
参数名 | 必选 | 说明 |
---|---|---|
KEY | 是 | 开启 Key 防盗链时填写的密钥。必须由大小写字母(a-Z)或者数字(0-9)组成,长度在8 - 20个字符之间。建议在控制台中单击【生成KEY】生成。 |
Dir | 是 | 视频原始 URL 的 PATH 中除去文件名的那部分路径。假设原始 URL 为http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4 ,则播放路径为/dir1/dir2/ 。 |
t | 是 | 播放地址的过期时间戳,以 Unix 时间的十六进制小写形式表示。过期后该 URL 将不再有效,返回 403 响应码。过期时间戳不要过短,使视频有足够时间完整播放。 |
exper | 否 | 试看时长,单位为秒,以十进制表示。不填或者填0表示不试看(即返回完整视频)。试看时长不要超过视频原始时长,否则可能导致播放失败。 |
rlimit | 否 | 最多允许多少个不同 IP 的终端播放,以十进制表示,不填表示不做限制。当限制 URL 只能被1个人播放时,建议 rlimit 不要严格限制成1(比如可以设置成3),因为移动端断网后重连 IP 可能改变。 |
us | 否 | 链接标识,用于随机化一个防盗链 URL,增强链接的唯一性。建议每次生成防盗链 URL 时,指定一个随机的 us 值。 |
sign | 是 | 防盗链签名,以32个字符长的十六进制数表示,用于校验防盗链 URL 的合法性。签名校验失败将返回 403 响应码。下面将介绍 签名计算公式。 |
sign = md5(KEY + Dir + t + exper + rlimit + us)
公式中的+
代表字符串拼接,选填参数可以为空字符串。
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4
。24FEQmTzro4V5u3D5epW
。72d4cd1101
。以此假设为例,下面分别就“视频播放地址有效时间控制”,“视频播放地址允许最多播放 IP 数”和“视频允许播放时长控制”两个场景,介绍如何生成防盗链 URL。
第一步:确定防盗链参数
首先,确定除了签名sign
以外的防盗链参数。
参数名 | 取值 | 说明 |
---|---|---|
KEY | 24FEQmTzro4V5u3D5epW |
开发者开通 Key 防盗链时选择的密钥 |
Dir | /dir1/dir2/ |
原始播放 URL 的 PATH 中除去myVideo.mp4 的剩余部分 |
t | 5a71afc0 |
过期时间戳1517400000的十六进制表示结果 |
us | 72d4cd1101 |
生成的随机字符串 |
第二步:计算签名
根据签名计算公式,获得签名结果。
sign = md5("24FEQmTzro4V5u3D5epW/dir1/dir2/5a71afc072d4cd1101") = "3d8488faeb37d52d6bf63b63c1b171c3"
第三步:生成防盗链 URL
将防盗链参数拼接到视频原始 URL 的 QueryString 中,就得到了视频防盗链 URL:
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=5a71afc0&us=72d4cd1101&sign=3d8488faeb37d52d6bf63b63c1b171c3
第一步:确定防盗链参数
首先,确定除了签名sign
以外的防盗链参数。
参数名 | 取值 | 说明 |
---|---|---|
KEY | 24FEQmTzro4V5u3D5epW |
开发者开通 Key 防盗链时选择的密钥 |
Dir | /dir1/dir2/ |
原始播放 URL 的 PATH 中除去myVideo.mp4 的剩余部分 |
t | 5a71afc0 |
过期时间戳1517400000的十六进制表示结果 |
rlimit | 3 |
限制最多允许3个不同的 IP 播放 URL |
us | 72d4cd1101 |
生成的随机字符串 |
第二步:计算签名
根据签名计算公式,获得签名结果。
sign = md5("24FEQmTzro4V5u3D5epW/dir1/dir2/5a71afc0372d4cd1101") = "c5214f0d5961b13acd558b4957c4dfc5"
第三步:生成防盗链 URL
将防盗链参数拼接到视频原始 URL 的 QueryString 中,就得到了视频防盗链 URL:
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=5a71afc0&rlimit=3&us=72d4cd1101&sign=c5214f0d5961b13acd558b4957c4dfc5
第一步:确定防盗链参数
首先,确定除了签名sign
以外的防盗链参数。
参数名 | 取值 | 说明 |
---|---|---|
KEY | 24FEQmTzro4V5u3D5epW |
开发者开通 Key 防盗链时选择的密钥 |
Dir | /dir1/dir2/ |
原始播放 URL 的 PATH 中除去myVideo.mp4 的剩余部分 |
t | 5a71afc0 |
过期时间戳1517400000的十六进制表示结果 |
exper | 300 |
试看前5分钟,即300秒 |
us | 72d4cd1101 |
生成的随机字符串 |
第二步:计算签名
根据签名计算公式,获得签名结果。
sign = md5("24FEQmTzro4V5u3D5epW/dir1/dir2/5a71afc030072d4cd1101") = "547d98c4b91e81b5ea55c95cef63223f"
第三步:生成防盗链 URL
将防盗链参数拼接到视频原始 URL 的 QueryString 中,就得到了视频防盗链 URL:
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=5a71afc0&exper=300&us=72d4cd1101&sign=547d98c4b91e81b5ea55c95cef63223f
点播为开发者提供了 Key 防盗链 URL 的生成工具和校验工具,开发者可以使用该工具快捷准确地生成和校验符合要求的防盗链 URL。
t
,exper
,rlimit
,us
,sign
的顺序出现,如果顺序不正确将无法播放视频。
加密算法
点播系统目前支持 HTTP Live Streaming 中规定的加密方案,该方案的安全级别可以达到:
如果您需要定制私有化的视频加密方案,可以与腾讯云客服联系。
播放器适配性
腾讯云点播视频加密方案能够支持所有 HLS 播放器。
密钥管理服务(Key Management Service,简称 KMS)
一项安全管理服务,主要负责数据密钥的生产、加密、解密等工作。例如腾讯云的 密钥管理服务。
数据密钥(Data Key,简称 DK)
由 KMS 系统生成的,用于对称加解密的密钥。
加密后的数据密钥(Encrypted Data Key,简称 EDK)
经过 KMS 系统加密之后的 DK,可以用于公开分发。要通过 EDK 换取 DK,必须调用 KMS 的解密接口。
视频加密过程是通过转码操作来实现的,不会产生新的 FileID。与一般转码场景相比,视频加密转码的主要区别在于:
使用HTTP协议时,可以利用头信息中的Referer做防盗链。
我们在一些网站的网页里访问图片的时候,在图片本站是可以正常看到的,但在外头就不能看到了,这是因为在http的header信息中的referer元素。还有是做统计的时候,我们需要统计出来用户是从哪个地方,什么时间访问网站的。
在HTTP协议中,头信息中有一个很重要的选项 referer,referer 表示的是网页的来源以及上一页的地址。如果直接在浏览器输入地址,进入网站,则没有referer头信息。
所以,服务器可以根据referer来知道用户从哪个网站进来的和图片是从哪个网站进来的。
下面以两个常用的库来添加防盗链,其他基本类似。
1. 使用okHttp网络框架进行下载
防盗链的添加
Request request = new Request.Builder().tag(url).url(url)
.addHeader("Referer", "http://xxx.com") //添加防盗链
.build();
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
Call myCall = httpClient.newCall(request);
myCall.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
...
}
@Override
public void onResponse(Call call, Response response) throws IOException {
...
}
});
2. 使用Glide框架加载图片
添加防盗链:
public void displayImageView(Context context, ImageView imageView, String url, int defaultResourceId) {
if (context instanceof Activity && !((Activity) context).isFinishing()) { //判断条件,防止Activity已经finish了,ImageView仍然还在加载图片
Glide.with(context).load(buildGlideUrl(url)).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop()
.placeholder(defaultResourceId).error(defaultResourceId).into(imageView);
}
}
private GlideUrl buildGlideUrl(String url) {
if (TextUtils.isEmpty(url)) {
return null;
} else {
return new GlideUrl(url, new LazyHeaders.Builder().addHeader("Referer", "http://xxx.com").build());
}
}
参考文档:
云社区:https://cloud.tencent.com/developer/information/视频地址加密
腾讯:https://cloud.tencent.com/document/product/266/11243
阿里云:https://www.alibabacloud.com/help/zh/doc-detail/65105.htm?spm=a2c63.p38356.b99.42.65ee48ce56Ief4
android获取视频、图片时添加防盗链:https://blog.csdn.net/wangsf1112/article/details/73188977
互联网视频防盗链的研究(referer,Token防盗链):https://www.jianshu.com/p/96ba2f4eea6b?utm_campaign
Android的MediaPlayer在播放时设置Http请求头:https://blog.csdn.net/enlangs/article/details/39546785
android 6.0 以下的 MediaPlayer 居然不能携带 http headers Referer:https://blog.csdn.net/lzy0168/article/details/53186362