DRM(数字权限管理技术)防截屏录屏----解密org.w3.clearkey视频并播放

devtools/2024/11/30 13:39:29/

提示:解密org.w3.clearkey视频并播放
帮助:未实现clearkey加密,如有大神,请指导一下

文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、教程
  • 二、org.w3.clearkey视频播放
  • 三、效果
  • 四、问题
  • 总结

前言

‌‌ClearKey‌是一种基于JSON Web Key (JWK)格式的内容加密方案,主要用于在Web环境中保护媒体内容的安全传输和播放。ClearKey通过使用JSON Web Tokens (JWT)来传输密钥信息,确保只有持有正确密钥的用户才能解密和播放受保护的媒体内容。

ClearKey的工作原理
‌1、密钥管理‌:ClearKey使用JWT来传输密钥信息,JWT包含三个部分:头部、有效载荷和签名。头部描述了令牌的类型和加密方法,有效载荷包含密钥信息,签名用于验证令牌的真实性。
2‌、密钥获取‌:在播放受保护的媒体内容时,浏览器会向服务器请求JWT,服务器验证请求者的身份后,返回包含密钥信息的JWT。
3‌、解密播放‌:浏览器使用JWT中的密钥信息对媒体内容进行解密,然后通过MediaSource Extensions (MSE)进行播放。

一、教程

mse-eme教程

二、org.w3.clearkey视频播放

test.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><video preload="auto" id="video" controls></video><script>const KEYSYSTEM_TYPE = "org.w3.clearkey";var videoFragments = [// demo 视频"video/init.mp4","video/seg-1.mp4","video/seg-2.mp4","video/seg-3.mp4","video/seg-4.mp4","video/seg-5.mp4","video/seg-6.mp4","video/seg-7.mp4"];var name = 'video';// 音频类型const audioContentType = 'audio/mp4; codecs="mp4a.40.2"'; // AAC-LC// 视频类型const videoContentType = 'video/mp4; codecs="avc1.42E01E"'// 创建mediaSourceconst videoSource = new MediaSource();var keys = {"2fef8ad812df429783e9bf6e5e493e53": "7f412f0575f44f718259beef56ec7771","7eaa636ee7d142fd945d1f764877d8db": "624db3d757bb496fb93e51f341d11716"};async function load() {const videoEl = document.getElementById('video');videoEl.src = URL.createObjectURL(videoSource);videoEl.sessions = [];// 解码videoEl.addEventListener("encrypted", async(ev) => {let options = [{initDataTypes: ["cenc"],videoCapabilities: [{contentType: videoContentType}],audioCapabilities: [{contentType: audioContentType}]}];if (typeof(MediaKeySystemAccess.prototype.getConfiguration) == "undefined") options = [{initDataType: "cenc",videoType: videoContentType,audioType: audioContentType}];// 获取系统允许let systemAccess = await navigator.requestMediaKeySystemAccess(KEYSYSTEM_TYPE, options);// 获取mediaKeysvar mediaKeys = await systemAccess.createMediaKeys();// 设置播放器mediaKeysawait videoEl.setMediaKeys(mediaKeys);// 生成sessionlet session = await videoEl.mediaKeys.createSession();videoEl.sessions.push(session);// 获取请求let request = await session.generateRequest(ev.initDataType, ev.initData)session.addEventListener("message", async(e) => {let message = ArrayBufferToString(e.message);let msg = JSON.parse(message);let outKeys = [];for (let i = 0; i < msg.kids.length; i++) {// 获取单个message的idlet id = msg.kids[i];// 获取全小写的hex格式的idlet hexId = Base64ToHex(id).toLowerCase();// 获取keys中键为hexId的值 let key = keys[hexId];if (key) outKeys.push({"kty": "oct","alg": "A128KW","kid": id,"k": HexToBase64(key)});}if (outKeys.length < 1) return console.log('解码失败!!!')let update = JSON.stringify({"keys": outKeys,"type": msg.type});await e.target.update(StringToArrayBuffer(update));});session.addEventListener("keystatuseschange", (e) => {});})videoSource.addEventListener('sourceopen', openSourceFile)}// Hex转base64function HexToBase64(hex) {var bin = "";for (var i = 0; i < hex.length; i += 2) {bin += String.fromCharCode(parseInt(hex.substr(i, 2), 16));}return window.btoa(bin).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");}// base64转Hexfunction Base64ToHex(str) {var bin = window.atob(str.replace(/-/g, "+").replace(/_/g, "/"));var res = "";for (var i = 0; i < bin.length; i++) {res += ("0" + bin.charCodeAt(i).toString(16)).substr(-2);}return res;}// buffer转字符串function ArrayBufferToString(arr) {var str = '';var view = new Uint8Array(arr);for (var i = 0; i < view.length; i++) {str += String.fromCharCode(view[i]);}return str;}// 字符串转bufferfunction StringToArrayBuffer(str) {var arr = new ArrayBuffer(str.length);var view = new Uint8Array(arr);for (var i = 0; i < str.length; i++) {view[i] = str.charCodeAt(i);}return arr;}// 打开文件async function openSourceFile() {videoSource.removeEventListener('sourceopen', openSourceFile);let sourceBuffer = videoSource.addSourceBuffer(videoContentType);let bufferList = [];let count = 0;if (videoSource.readyState == 'closed') return console.log('视频readyState为关闭');// for循环里直接appendBuffer会报错for (let i = 0; i < videoFragments.length; i++) {const buffer = await loadFile(videoFragments[i]);if (buffer) bufferList.push(buffer);}// 首次appendBufferawait sourceBuffer.appendBuffer(bufferList[count]);sourceBuffer.addEventListener("updateend", async() => {count++;if (count < bufferList.length) await sourceBuffer.appendBuffer(bufferList[count]);});}// 加载文件function loadFile(src) {return new Promise((resolve, reject) => {let xhr = new XMLHttpRequest();xhr.open('GET', src);xhr.responseType = 'arraybuffer';xhr.addEventListener("load", (buffer) => {resolve((buffer.target || buffer.target).response)});xhr.addEventListener("error", () => {console.log("error:" + src);reject();});xhr.addEventListener("abort", () => {console.log("aborted:" + src);reject();});xhr.send()});}load();</script>
</body></html>

三、效果

demo仅加载视频示例,未加载音频
在这里插入图片描述

视频仅做测试使用,未进行任何商业用途, 遮挡一下看到播放效果即可,如有侵权,联系作者删除。

四、问题

加密插件:
shaka package:3.4.0、3.3.0、3.2.1执行无反应,使用3.2.0可执行加密,但不支持clearkey

packager input=libx264.mp4,stream=video,output=encrypted_video.mp4 --keys key_id=00112233445566778899aabbccddeeff:key=ffeeddccbbaa99887766554433221100 --enable_raw_key_encryption --protection_systems "Widevine"

ffmpeg:不支持DRM的ckearkey加密

// ffmpeg -i test2.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 output.mp4
// ffmpeg -i test2.mp4 -c:v libx264 -c:a aac -f mp4 -encryption_scheme cenc-aes-ctr -key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 encrypted_video.mp4

mp4Box:未实现

// MP4Box.exe -crypt drm.xml test2.mp4 -out tempv.mp4
// MP4Box.exe -crypt drm.xml test2.mp4 -out tempa.mp4
// MP4Box.exe -dash 6000 -frag 6000 -mem-frags -rap -profile dashavc264:live -profile-ext urn:hbbtv:dash:profile:isoff-live:2012 -min-buffer 3000  -bs-switching no -sample-groups-traf -single-traf -subsegs-per-sidx 1 -segment-name $RepresentationID$_$Number$$Init=i -segment-timeline -out manifest.mpd tempv.mp4#trackID=1:id=v1:period=p0 tempa.mp4#trackID=1:id=a1:period=p0

总结

踩坑路漫漫长@~@


http://www.ppmy.cn/devtools/138209.html

相关文章

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时&#xff0c;为了避免域内受到非法访问的威胁&#xff0c;往往会设置防火墙。 使用NAT&#xff08;NAPT&#xff09;的情况下&#xff0c;由于限定了可以从外部访问的地址&#xff0c;因此也能起到防火墙的作用。 二、IDS入侵检…

网络安全(1)_对称加密和非对称加密

1 网络安全概述 1.1 计算机网络面临的安全威协 &#xff08;1&#xff09;截获&#xff1a;攻击者从网络上窃听他人的通信内容&#xff0c;通常把这类攻击称为“截获”。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元&#xff08;PDU&#xff09;而不干扰信…

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析

前言 本文仅分享Githack工具基本安装及使用相关知识&#xff0c;不承担任何法律责任。 Git是一个非常流行的开源分布式版本控制系统&#xff0c;它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统&#xff0c;并将其部署到生产环境中以维护其代…

基于单片机的智能药箱设计

本设计主要由红外检测传感器、显示、独立按键、舵机、语音以及短信等模块组成。红外传感器模块主要对药仓中的药物数据进行采集&#xff0c;采集完毕由主控制器进行数据加工&#xff0c;之后可传送至显示模块上进行显示&#xff0c;在显示模块也可对显示时间、吃药倒计时、吃药…

《软件项目管理》期末-复习题及参考答案

&#xff08;1&#xff09;赶工一个任务时&#xff0c;你应该关注&#xff08; C &#xff09; A. 尽可能多的任务 B. 非关键任务 C. 加速执行关键路径上的任务 D. 通过成本最低化加速执行任务 &#xff08;2&#xff09;下列哪个不是项目管理计划的一部分&#xff1f;&#x…

Vue.js 指令详解:v-bind, v-html, v-once, v-on, v-if, v-else-if, v-else 和 v-model

Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它通过一系列的指令来实现数据与 DOM 的绑定。在本篇博客中&#xff0c;我们将通过一个示例来介绍 Vue 3 中的一些常用指令&#xff1a;v-bind, v-html, v-once, v-on, v-if, v-else-if, v-else 和 v-model。 1. v-bind…

【机器学习】机器学习的基本分类-监督学习-逻辑回归(Logistic Regression)

逻辑回归是一种分类算法&#xff0c;尽管名字中包含“回归”&#xff0c;但其主要用于解决二分类和多分类问题。它通过学习一个逻辑函数&#xff0c;预测输入属于某个类别的概率。 1. 逻辑回归的基本概念 目标 逻辑回归的目标是找到一个函数 h(x)&#xff0c;输出一个概率值 …

微信小程序Webview与H5通信

背景 近期有个微信小程序需要用到web-view嵌套H5的场景&#xff0c;该应用场景需要小程序中频繁传递数据到H5进行渲染&#xff0c;且需要保证页面不刷新。 由于微信小程序与H5之间的通信限制比较大&#xff0c;显然无法满足于我的业务场景 探索 由于微信小程序与webview的环境是…