视频播放控制:防盗链设置与视频加密及Android中的基础应用

数字版权管理(Digital Rights Management,DRM),对于在线教育、行业培训等领域都是十分重要的。视频文件的泄露,有可能造成十分严重的经济损失。

传统的视频服务提供商大多是通过各种各样的防盗链机制来实现视频内容保护。该方案的基本原理是:App 服务端给客户派发专属的视频 URL,CDN 服务对请求 URL、请求 IP、HTTP 头等参数进行校验,如果校验通过,则返回正常的视频数据;否则返回 403 错误码。

但是,对于需要付费观看的视频,一旦恶意用户通过一次付费行为拿到了合法的防盗链播放 URL,其便可以将视频完整下载到本地,进而实现二次分发。因此,防盗链方案对于视频版权保护是远远不够的。要进一步提升视频内容的保护程度,就不能仅仅在视频的分发环节做文章,而是必须对视频数据本身的加密。对视频数据加密之后,即使恶意用户把视频下载到本地,视频本身也是被加密的,这样就提高了恶意用户将视频内容二次分发的门槛。

防盗链综述

为支持视频播放的权限控制,推出了防盗链的解决方案。开通防盗链后, CDN 节点将对播放请求中的关键信息进行检查,并对通过检查的请求返回视频数据。

一般的点播防盗链支持 Referer 防盗链和 Key 防盗链两种类型。Key 防盗链在不同的平台又称为URL鉴权或TOKEN防盗链,基本机制一样。

Referer防盗链

功能介绍

  • 基于 HTTP 协议支持的 Referer 机制,通过 HTTP 头部中携带的 Referer 字段识别请求的来源。开发者可以通过配置 Referer 黑白名单,对视频请求来源进行识别和鉴权 。
  • 支持黑名单和白名单两种模式。当视频播放请求到达 CDN 节点后,节点将依据用户配置的 Referer 黑白名单对请求来源鉴权。对于符合规则的请求,CDN 将返回视频数据。否则,将返回403响应码,拒绝播放请求。

注意事项

  • 该功能为可选项,默认不启用。
  • 开启功能后,选择并填写黑名单或白名单,黑名单和白名单互斥,同一时间仅支持一种模式。
  • 黑名单或白名单中的域名支持1 - 10条,每一行一条记录。
  • 域名前不要带协议名(http://https://),域名为前缀匹配(填写 abc.com,则 abc.com/123abc.com.cn 也会匹配),且支持通配符(*.abc.com)

Key 防盗链

功能介绍

  • 支持在视频 URL 中指定过期时间,他人获取后无法长期使用。
  • 支持在视频 URL 中指定最大允许播放 IP 数,他人获取后不能无限制地分发给更多人观看。
  • 支持在视频 URL 中指定试看时长,实现试看功能。
  • 开发者使用密钥(KEY)对视频 URL 签名,并在 URL 中带上签名结果。只要用户密钥不泄露,其他用户无法伪造视频 URL。
  • CDN 节点检查视频 URL 中的参数和签名,对视频播放请求进行控制。如果请求检查不通过,将返回403响应码。

防盗链 URL 生成方式

  • 开发者在腾讯云点播中的视频均存在视频原始 URL。未开启防盗链时,使用视频原始 URL 即可播放视频。
  • 开启 Key 防盗链后,视频原始 URL 不再能播放,此时需要构造视频的防盗链 URL

视频的防盗链 URL 的生成规则是在原始 URL 后以 QueryString 的方式加入防盗链参数,形如:


  •  

http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=[t]&exper=[exper]&rlimit=[rlimit]&us=[us]&sign=[sign]

QueryString 中的防盗链参数必须按照texperrlimitussign的顺序拼接,下面详细介绍防盗链 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)

公式中的+代表字符串拼接,选填参数可以为空字符串。

防盗链 URL 生成示例

  • 假设某个开发者在腾讯云点播中有一个视频,视频的原始播放 URL 是http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4
  • 该开发者开通了 Key 防盗链,生成的密钥是 24FEQmTzro4V5u3D5epW
  • 希望为这个视频生成防盗链 URL,URL 的过期时间是2018年1月31日20:00整(Unix 时间为1517400000)。
  • 如果要生成一个试看 URL,希望试看时长为视频的前5分钟(视频原始时长大于5分钟)。
  • 如果要限制 URL 可播放的 IP 数,希望允许最多3个不同 IP 的终端可以播放该 URL。
  • 生成防盗链 URL 时生成了一个随机字符串72d4cd1101

以此假设为例,下面分别就“视频播放地址有效时间控制”,“视频播放地址允许最多播放 IP 数”和“视频允许播放时长控制”两个场景,介绍如何生成防盗链 URL。

示例1:视频播放地址有效时间控制

第一步:确定防盗链参数

首先,确定除了签名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

示例2:视频播放地址最多可播放 IP 数

第一步:确定防盗链参数

首先,确定除了签名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

示例3:视频允许播放时长控制

第一步:确定防盗链参数

首先,确定除了签名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 防盗链生成和校验工具

点播为开发者提供了 Key 防盗链 URL 的生成工具和校验工具,开发者可以使用该工具快捷准确地生成和校验符合要求的防盗链 URL。

注意事项

  • 该功能为可选项,默认不启用。
  • 启用该功能后,视频原始 URL 将不再能直接播放,需要按规则生成合法的防盗链 URL。
  • 密钥 KEY 必须由大小写字母(a-Z)或者数字(0-9)组成,长度在8-20个字符之间。
  • 若防盗链 URL 过期,或者签名不能通过,将无法播放视频,并返回403响应码。
  • 防盗链 URL 中 QueryString 中各参数必须按照texperrlimitussign的顺序出现,如果顺序不正确将无法播放视频。
  • 考虑到机器之间可能存在时间差,防盗链 URL 的实际过期时间一般比指定的过期时间长5分钟,即额外给出300秒的容差时间。
  • 如果使用试看功能,需确保试看时长不大于视频时长,否则将导致视频无法播放。
  • 试看对视频的格式有较严格的要求(仅支持 H264,视频元信息在视频文件的头部等),不符合格式要求的原始视频使用试看功能将产生异常。建议使用点播转码功能进行转码,对转码后视频设置试看(转码后的格式均符合试看格式要求)。

点播视频加密方案

加密算法

点播系统目前支持 HTTP Live Streaming 中规定的加密方案,该方案的安全级别可以达到:

  1. 使用 AES-128 对视频内容本身进行加密;
  2. 支持对单个视频文件使用多个密钥进行加密,避免单个密钥泄露导致整个文件泄密。

如果您需要定制私有化的视频加密方案,可以与腾讯云客服联系。

播放器适配性

腾讯云点播视频加密方案能够支持所有 HLS 播放器。

术语介绍

密钥管理服务(Key Management Service,简称 KMS)

一项安全管理服务,主要负责数据密钥的生产、加密、解密等工作。例如腾讯云的 密钥管理服务

数据密钥(Data Key,简称 DK)

由 KMS 系统生成的,用于对称加解密的密钥。

加密后的数据密钥(Encrypted Data Key,简称 EDK)

经过 KMS 系统加密之后的 DK,可以用于公开分发。要通过 EDK 换取 DK,必须调用 KMS 的解密接口。

整体架构

视频加密过程是通过转码操作来实现的,不会产生新的 FileID。与一般转码场景相比,视频加密转码的主要区别在于:

  1. 加密转码,转出来的视频是经过加密的;
  2. 加密转码完成之后,如果通过点播播放器来播放视频,源文件播放地址是不会被获取到的。

基础应用:android获取视频、图片时添加防盗链

使用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

猜你喜欢

转载自blog.csdn.net/MYBOYER/article/details/88352651