随着在线视频和在线教育以的兴起,在线视频系统越来越多,如在线知识网站、在线课程、在线教育培训等网站,我们之前讲过关于视频网站的搭建、视频的云存储、视频的加速播放等,今天的主要话题是视频内容如何防盗链或者防止非法下载。
我们之前有讲过一篇文章,视频播放如何实现防盗链,此文主要是对播放地址加Token的方式来实现放盗链,但是token很容易获取,并且视频文件也很容易缓存下来,来将缓存的视频进行提取即可。
本文主要介绍,通过对视频内容文件进行加密的方式来实现放盗链,这样可以避免非授权用户通过播放URL下载或播放点播视频,有效的实现对视频内容的版权保护,算是更高级的加密方式。
加密过程
视频的播放格式介绍
先介绍一下网站的流媒体视频播放格式,HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是m3u8描述文件,二是TS媒体文件,统称M3U8格式。
m3u8格式的文件只是存储多媒体播放列表,提供了一个指向其他位置的音频视频文件的索引,你播放的还是那些被指向的文件,是一系列的TS文件,本分成多个TS文件主要是为了方便加载,比如用户拖动进度条,就可以直接跳转到对应的TS文件即可,不需要加载整个视频文件,因而节省了网络带宽。
m3u8格式的优点:
- 可以多码率的适配。根据网络带宽,客户端会自动选择一个适合自己码率的文件进行播放,保证视频流的流畅,代表是苹果的HLS(HTTP Live Streaming)。HLS有一个特点:自适应码率流播(adaptive streaming),客户端可以根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。
- 降低源服务器的负载压力。M3U的特点是将流媒体切分为若干 TS 片段,然后通过一个扩展的 m3u 列表文件将这些 TS 片段集中起来供客户端播放器接收。这样做相比使用 RTSP 协议的好处在于,一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了 CDN 边缘服务器的配置要求,可以使用任何现成的CDN。分发使用的协议是最常见 HTTP,代理服务器对这个协议的缓存优化相当成熟,而很少有代理服务器对 RTSP 地进行缓存优化。
- 对于非实时视频,播放使用HTTP协议的单个 MP4 格式的视频文件时,需要代理服务器支持 HTTP range request 以获取大文件中的一部分,但不是所有的代理服务器都对此有良好的支持。而 M3U 则只需要根据列表文件中的时间轴找出对应的 TS 片段下载即可,不需要 range request,对代理服务器的要求小很多。所有代理服务器都支持小文件的高效缓存。
- 为什么要用 TS 而不是 MP4,这是因为两个 TS 片段可以无缝拼接,播放器能连续播放,而 MP4 文件由于编码方式的原因,两段 MP4 不能无缝拼接,播放器连续播放两个 MP4 文件会出现破音和画面间断,影响用户体验。
TS流程
视频加密实现原理
视频网站的加密就是对HLS/M3U8文件的加密,使用HLS加密时,初时生成的密钥是存储在点播服务中的,业务侧在初步播放时需要从点播中查询获取密钥,这要求业务侧自行搭建密钥管理服务,组装带token的播放url,从点播服务中获取密钥,缓存后再返回给播放器解密播放。
视频加密原理,主要是通过指定的AES-128加密算法来加密每一个TS,并在生成的m3u8文件中描述播放器如何解密TS文件的方法,支持所有的HLS播放器,前端播放器根据业务规则,获取解密秘钥,然后解密TS文件,进行解密播放。
加密流程
加密过程:
- 业务侧将视频上传到点播服务(VOD)后,请求HLS加密。
- 点播服务收到加密请求后,向KMS请求加密密钥,并将获取的密钥ID和密钥密文存储在点播服务中。
- 点播服务向媒体处理服务请求HLS加密,媒体处理服务通过转码功能将对应的视频进行加密。
- 转码加密后生成的m3u8文件带有“#EXT-X-KEY”标签,该标签包含了“METHOD”和“URI”属性,其中“URI”即为业务侧搭建的密钥管理服务的地址。
- 加密后,点播服务通过CDN将加密的HLS视频文件进行加速分发。
解密过程:
- 终端用户登录播放器终端,业务侧会对终端用户进行身份校验,校验通过后,会为播放终端分配一个Token,并将带Token的播放地址返回给播放器端。
- 播放器终端通过带Token的播放URL向CDN请求播放。由于Token是动态的,所以CDN收到请求后,会直接回源到点播服务。点播服务会将请求URL中的Token写入请求的m3u8文件的“URI”中。点播服务返回给CDN的m3u8文件中会携带播放终端的Token值。
- 播放终端解析返回的m3u8文件,得到EXT-X-KEY标签中的“URI”内容,向“URI”请求密钥。
- 业务侧的密钥管理服务收到请求后,先验证Token的合法性,若Token合法,则通过调用点播服务的API查询密钥。
- 密钥管理服务可以选择将查询到的密钥缓存在本地,当下次有其它播放终端请求时,可以直接返回,无需每次都向点播服务获取。
- 密钥管理服务将点播服务返回的密钥返回给播放终端。播放终端通过获取的密钥解密播放m3u8文件。
代码实现方式
加密服务一般由第三方服务实现,以及直接格式转换,比如一些云厂商或者视频托管厂商,如果要自建,用万能的 ffmpeg 也可以实现,简单过程如下:
1. Key文件
#!/bin/sh BASE_URL=${1:-'.'}
openssl rand 16 > file.key
echo $BASE_URL/file.key > file.keyinfo
echo file.key >> file.keyinfo
echo $(openssl rand -hex 16) >> file.keyinfo
参数详解:
BASE_URL:网站url地址
openssl rand 16 > file.key 生成一个key文件
echo $BASE_URL/file.key > file.keyinfo 将外部访问的file.key映射到file.keyinfo文件中。
echo file.key >> file.keyinfo 将项目file.key所在的文件路径映射到fike.keyinfo文件中。
echo $(openssl rand -hex 16) >> file.keyinfo 生成IV密钥
2. 执行命令
ffmpeg -y -i 视频文件绝对路径/202203271023300d469.mp4 \
-preset:v veryfast -hls_time 5 -c:a aac -hls_key_info_file ase加密文件的绝对路径/file.keyinfo \
-hls_segment_filename 转码之后的ts文件的存放路径/%04d.ts \
-hls_list_size 0 转码之后m3u8文件存放的绝对路径/index.m3u8
参数说明:
-hls_key_info_file 加密文件的路径 这个指令是转码之后ts文件是否加密的关键指令
转换加密前的文件
转换后的文件
结论
所以,对TS的加密从而达到对视频加密的目的,将加密后的视频地址存放到CMS管理,在APP/网站等播放器端进行技术对接,使得加密视频只能在特定的APP/网站中使用,即使用户下载了TS文件,也无法解密播放,安全性更高。
最终使用了加密播放的视频,可以实现有效的版权保护、二次售卖等一些用户的非法操作,从而实现了对我们内容的有效保护。
关于视频网站的搭建可以参考之前的文章:
CMS构建课程平台:如何解决播放流量和带宽的问题
通过CMS构建视频课程平台
欢迎转载,请注明出处!
===================
大家好,我是Robbin,来给大家讲CMS。
主要讲解如何使用开源Drupal + 可视化工具GrapeJS (构建)=> 可视化、模块化、低代码的、易上手的CMS平台。可以快速构建网站、手机站、产品站、在线教育、课程售卖、售后咨询等平台的工具。
==================