企业内训课程、在线教育平台付费课程加密防下载的10种方式
企业内训课程、在线教育平台付费课程加密防下载的10种方式:
实例演示:课程视频-第1课状语从句,VRM演示应用
企业内训课程、在线教育平台付费课程,他们的这种视频课程的加密是如何做的?整理了10种思路,供大家参考:
1.VRM分片错序视频加密
采用分布式编码技术,将视频文件物理切片,每片视频进行多种算法混合型加密, 同时结合独立研制密码本,将关键数据进行错序混淆,对视频文件进行最高级别加密,这样经过加密的视频内容即使被下载,也无法进行恶意的二次分发,视频破解难度倍增。

2.Html5全链路视频加密
市面上常见的H5加密,采用标准的Apple HLS Encryption 视频保护机制,我们在此基础上进行深度优化,对密钥key进行深度加密,同时实现对视频播放器与视频数据文件双重加密处理,形成端到端的全链路视频安全防护,即使视频文件被盗用,其他应用也无法播放,让视频更加安全。
我们的加密调用方法示例:
<div id="player"></div>
<script src="//player.polyv.net/script/player.js"></script>
<script>
var player = polyvPlayer({wrap: '#player',width: 800,height: 533,vid: '88083abbf5bcf1356e05d39666be527a_8', playsafe:'81814fed-bdd0-4506-bec1-ebc8093148c5-hfevwsfxcsbcocx', //playsafeUrl:'https://myDomain.com/token', // 业务方自定义的获取播放凭证接口URL,与playsafe参数二选一ts:'1568131545000',sign:'88313661ba7ded642c7b557b0a364b4b'
});//切换加密视频时,需要重新获取播放凭证。如果初始化播放器时使用了playsafeUrl参数,则播放器会自动获取新的凭证,无需传playsafe参数。
player.changeVid({vid: '88083abbf5bcf1356e05d39666be527a_9', //需要切换的视频vidplaysafe: '81814fed-bdd0-4506-bec1-ebc8093148c6-hfevwsfxcsbcocx', //新获取的playsafe tokensign: '88313661ba7ded642c7b557b0a364b4c', //新获取的sign和ts参数ts: '1568131545001'
});
</script>
Web页面播放加密视频前,需要先访问业务方自己的服务端授权验证接口(可以在这里加上自有业务的授权验证逻辑,例如是否登录、是否购买课程等, 建议使用HTTPS)。如果业务上允许播放,则通 过创建 Playsafe Token接 口获取播放凭证(或者在服务端生成sign、ts参数),并返回给Web端播放器。

服务端生成播放凭证代码示例:
// 接口中应附带自有业务的授权验证逻辑,如判断是否登录、是否购买课程等// 以下为生成播放凭证的代码示例
function get_client_ip() {if (!empty($_SERVER['HTTP_CLIENT_IP'])) {$ipaddress = $_SERVER['HTTP_CLIENT_IP'];} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];} else {$ipaddress = $_SERVER['REMOTE_ADDR'];}return $ipaddress;
}$userId = 'your userId'; // 保利威点播账号的userId
$secretkey = 'your secretkey'; // 保利威点播账号的secretkey
$videoId = '88083abbf5bcf1356e05d39666be527a_8'; // 视频vid
$ts = time() * 1000; // 时间戳
$viewerIp = get_client_ip(); // 观众ip
$viewerId = '12345'; // 观众id
$viewerName = 'testUser'; // 观众昵称, 若值为中文需要urlencode('张三')
$extraParams = 'HTML5'; // 自定义扩展参数
$disposable = false // true 表示 token 仅一次有效。false 则表示在有效期内可以多次验证。默认为 false。/* 将参数 $userId、$secretkey、$videoId、$ts、$viewerIp、$viewerIp、$viewerId、$viewerName、$extraParams按照ASCKII升序 key + value + key + value ... +value 拼接
*/
$concated = 'extraParams'.$extraParams.'ts'.$ts.'userId'.$userId.'videoId'.$videoId.'viewerId'.$viewerId.'viewerIp'.$viewerIp.'viewerName'.$viewerName;
// 首尾加上secretkey值
$plain = $secretkey.$concated.$secretkey;
// 取大写MD5
$sign = strtoupper(md5($plain));// 然后将下列参数用post请求 https://hls.videocc.net/service/v1/token 获取 token
$url = 'https://hls.videocc.net/service/v1/token';
$data = array('userId' => $userId, 'videoId' => $videoId, 'ts' => $ts, 'viewerIp' => $viewerIp, 'viewerName' => $viewerName, 'extraParams' => $extraParams, 'viewerId' => $viewerId, 'sign' => $sign);
$options = array('http' => array('header' => "Content-type: application/x-www-form-urlencoded",'method' => 'POST','content' => http_build_query($data))
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);// 获取接口返回结果中的token值, 并传给播放器播放加密视频
$token = json_decode($result)->data->token;
echo $token;
Java SpringMvc代码:
@ResponseBody
@RequestMapping("/playerSafe")
public String playerSafe(HttpServletRequest request) {String userId = "your userId"; // 保利威点播账号的userIdString secretkey = "your secretkey"; // 保利威点播账号的secretkeyString videoId = "88083abbf5bcf1356e05d39666be527a_8"; // 视频vidlong ts = System.currentTimeMillis(); // 时间戳String viewerIp = getClientIp(request); // 观众ipString viewerId = "12345"; // 观众idString viewerName = "testUser"; // 观众昵称, 若值为中文需要urlencode('张三')String extraParams = "HTML5"; // 自定义扩展参数boolean disposable = false; // true 表示 token 仅一次有效。false 则表示在有效期内可以多次验证。默认为 false。/* 将参数 userId、secretkey、videoId、ts、viewerIp、viewerIp、viewerId、viewerName、extraParams按照ASCKII升序 key + value + key + value ... +value 拼接*/String concated = "extraParams" + extraParams + "ts" + ts + "userId" + userId + "videoId" + videoId + "viewerId" + viewerId + "viewerIp" + viewerIp + "viewerName" + viewerName;// 首尾加上secretkey值String plain = secretkey + concated + secretkey;// 取大写MD5,可自行选择md5库String sign = md5Hex(plain).toUpperCase();// 然后将下列参数用post请求 https://hls.videocc.net/service/v1/token 获取 tokenString url = "https://hls.videocc.net/service/v1/token";Map<String, String> params = new HashMap<>();params.put("userId", userId);params.put("videoId", videoId);params.put("ts", String.valueOf(ts));params.put("viewerIp", viewerIp);params.put("viewerName", viewerName);params.put("extraParams", extraParams);params.put("viewerId", viewerId);params.put("sign", sign);// 可自行选择http客户端String response = HttpClientUtil.getInstance().sendHttpPost(url, params);try {//解析jsonObjectMapper objectMapper = new ObjectMapper();TokenResponse tokenResponse = objectMapper.readValue(response, TokenResponse.class);// 响应代码,200为成功,403为ts过期或签名错误,400为参数错误(例如缺少 userId 或 videoId)if (tokenResponse.getCode() == 200) {Map data = (Map) tokenResponse.getData();return data.get("token").toString();}} catch (IOException e) {e.printStackTrace();}return "";
}
static class TokenResponse {int code;String status;String message;Object data;//省略getter、setter...
}
public String getClientIp(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;
}
3.用户ID跑马灯

将用户I的ID、电话号码或其他信息内容等设置在视频上不规则跑动(作追溯盗版者用)。 ID跑马灯功能,是指通过设定文字内容(一般是观众的身份ID信息)在视频上不规则滚动,以此来警示盗版者,达到视频版权保护的效果,示例中是将用户的ID和电话号码显示出来。
4.数字化动态水印

将用户ID、电话号码或其他信息内容等以动态水印形式展现在视频上,实现水印在视频上不规则地显现,可追溯录屏者身份,对翻录行为起到强有力的震慑作用。
5.浏览器防录屏

通过播放器实时监测,如果检测到视频处于录屏状态或小窗待录屏状态,视频会立即停止播放,显示报错信息,视频无法继续播放。
6.视频水印 (企业LOGO)
在视频中添加企业专属的视频水印,从而让视频中融入企业的版权信息,防止盗录者盗取版权,保护公司的知识产权。视频上传后自动将企业的LOGO图标水印加在视频右上角/右下角等位置上。
7.域名白名单OVP防盗链
通过OVP防盗链技术实现指定网站播放,俗称域名黑白名单。设置网站A白名单,则只允许视频在A网站下播放;设置网站B黑名单,则禁止视频在B网站下播放,可有效防止用户原创视频资源被非法盗用。

8.ATS/HTTPS数据防篡改
HTTPS协议,采用了HTTPS协议,其提供网站身份验证与加密通讯方法,避免信息截韧“钓鱼”攻击,有效防止网页被篡改,保证企业及学员间的信息 安全;ATS标准,苹果操作系统遵循ATS标准,开启ATS安全特性后,网络传输自动通过HTTPS协议进行传输,保证视频播放安全。
9.播放器代码混淆加密
播放器代码加密,防反编译、代码混淆等方式。
10.禁止拖动视频进度条
html5播放器禁止拖拽功能实例(常用于场景:企业培训、在线教学内容禁止学员拖动视频进行观看)。
我的文章推荐:
- [视频+图文] 线上研讨会是什么,企业对内对外培训可以用线上研讨会吗?
- [图文] 企业直播对网络带宽有什么要求?
- [图文]OBS如何实现毫秒级超低延时直播
- 直播播放器API(播放器调用方法、参数、接口和事件)
-
企业直播要如何做?硬件设备、网络环境有哪些要求?
相关文章:
企业内训课程、在线教育平台付费课程加密防下载的10种方式
企业内训课程、在线教育平台付费课程加密防下载的10种方式: 实例演示:课程视频-第1课状语从句,VRM演示应用 企业内训课程、在线教育平台付费课程,他们的这种视频课程的加密是如何做的?整理了10种思路,供大家参考&…...
公关世界杂志公关世界杂志社公关世界编辑部2023年第14期目录
封面印象 画里有大美 笔下有乾坤——品读吴建潮的绘画艺术和诗文创作 赵铁信; 4-9 专题报道 “安济欣看千年济,李春赢得万口春”——赵州桥诗词楹联文化鉴赏暨沈鹏书法艺术研讨会举行 刘占行; 10-14 中国书协第二三届理事、河北省书协原副主席兼秘书长、…...
Linux常用(实用)命令大全
pwd 显示当前工作路径 shutdown 关闭系统 /halt 关闭系统 shutdown -r now 重启 /reboot 重启 systemctl stop firewalld 关闭防火墙 ip addr 查看ip地址. 1、cd命令:用于切换当前目录(可以是绝对路径,也可以是相对路径)如&#x…...
2023-09-07力扣每日一题
链接: [2594. 修车的最少时间](https://leetcode.cn/problems/form-smallest-number-from-two-digit-arrays/) 题意: 一个能力R的人R*N*N分钟修N辆车,求最快多久修完(多人多车) 解: 二分很好想&#x…...
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
这篇就一直更新一些C的选择题和编程题了。 目录 笔试题1 答案及解析1 笔试题2 答案及解析2 力扣编程题 88. 合并两个有序数组 解析代码 349. 两个数组的交集 解析代码 60. 排列序列 解析代码 46. 全排列 解析代码 本篇完。 笔试题1 1. 以下哪种STL容器中的对象…...
适用于Linux的Windows子系统(系统安装步骤)
目录 前言 一、WSL2安装 1.Microsoft参考文档(推荐选择旧版 WSL 的手动安装步骤) 2.开启子系统 二、Ubuntu安装 1.在Microsoft Store中获取ubuntu 2.运行ubuntu配置管理信息 3.ubuntu换源 三、WSL 与 Ubuntu的一些基础使用命令 四、Windows Terminal终端…...
HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别
并行识别组合手势对应的GestureMode为Parallel。并行识别组合手势中注册的手势将同时进行识别,直到所有手势识别结束。并行识别手势组合中的手势进行识别时互不影响。 以在一个Column组件上绑定点击手势和双击手势组成的并行识别手势为例,由于单击手势和…...
如何使用GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图
GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域: 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言,都可以为你提供相关的代码示例。 2、数据可…...
Blender中的高级边缘控制和纹理映射
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 步骤 1 首先,您需要创建一组无阴影材质,每种材质具有不同的颜色,确保您有足够的材质来覆盖模型,而不会有相同的颜色相互重叠。然后,切换到“着色”ÿ…...
从0开始学go第四天
模板继承 继承根模板,重新定义“块模板” 【Go Web开发系列教程】07-Go模板继承_哔哩哔哩_bilibili 解析模板时,base模板要在前 渲染模板时: 要用ExecuteTemplate,而不是Excute 模板补充:Go语言标准库之http/templ…...
【飞书ChatGPT机器人】飞书接入ChatGPT,打造智能问答助手
文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话,在下面操作步骤中…...
vue3集成jsoneditor
一、背景 之前在做录制回放平台的时候,需要前端展示子调用信息,子调用是一个请求列表数组结构,jsoneditor对数组的默认展示结构是[0].[1].[2]..的方式,为了达到如下的效果,必须用到 onNodeName的钩子函数,…...
自然语言处理 中文停用词词典
我整合了4个常用的中文停用词词典(https://gitcode.net/mirrors/goto456/stopwords/-/tree/master),剔除了其中的非中文词汇,得到停用词词典如下,可直接取用。 看见 并不是 有著 岂非 毫无保留地 这样 么 哎呀 互相 通…...
CocosCreator3.8研究笔记(十)CocosCreator 图像资源的理解
一、图像资源导入 Cocos Creator 可使用图像文件格式,支持 JPG、PNG、BMP、TGA、HDR、WEBBP、PSD、TIFF 等。 将图像资源直接拖拽到 资源管理器 即可将其导入 二、图像资源的类型 在 属性检查器 面板中便可根据需要设置图像资源的使用类型:raw 、 textu…...
计算机使用中常用截图与标注方法
一、截图常用方法 1.windows自带快捷键 Print Screen SysPq 截取全屏,可以粘到word文档中,可以粘贴到"画图"程序中,命名一个文件名,另存为图片,或.jpg后缀,或.png后缀 alt Print S…...
Elasticsearch,Logstash和Kibana安装部署(ELK Stack)
前言 当今数字化时代,信息的快速增长使得各类组织和企业面临着海量数据的处理和分析挑战。在这样的背景下,ELK Stack(Elasticsearch、Logstash 和 Kibana)作为一套强大的开源工具组合,成为了解决数据管理、搜索和可视…...
MATLAB中movmean函数用法
目录 语法 说明 示例 向量的中心移动平均值 向量的尾部移动平均值 矩阵的移动平均值 包含缺失值的向量的移动平均值 基于样本点计算移动平均值 仅返回满窗口平均值 movmean函数的功能是对数据进行移动求平均值。 语法 M movmean(A,k) M movmean(A,[kb kf]) M mov…...
IIS短文件名泄露漏洞复现
IIS短文件名泄露漏洞复现 前言一、漏洞描述二、漏洞原理1.什么是短文件2.短文件特征 三、漏洞验证三、漏洞防御总结 前言 IIS短文件名泄露漏洞比较老了,而且只适合于windowsiisasp的网络结构,所有如下的复现步骤看下就行了,关键是要弄懂原理…...
万字解读 Android 车机核心 :CarService 的构成和链路~
前言 关于 Android 车机,之前分析过方控上自定义按键的输入机制和中控上旋钮输入的原理,但都局限于 Car Service 内 Input 相关模块。 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车载的自定义事件机制 本文将结合 Android 系…...
C#使用Panel
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...
开源 vGPU 方案:HAMi,实现细粒度 GPU 切分
本文主要分享一个开源的 GPU 虚拟化方案:HAMi,包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案,HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制,保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…...
基于微信小程序的作业管理系统源码数据库文档
作业管理系统 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和微信小程序来完成对系统的…...
leetcode 386. 字典序排数 中等
给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1: 输入:n 13 输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]示例 2: 输入:n 2…...
