在上一篇文章里实现了对媒体文体的DRM加密,现在一起来实现License的预发放。

所谓预发放就是在播放媒体文件之前先获取到License,License获取成功后,可直接在电脑上进行媒体文件的播放。

实现步骤如下:
1. 新建WebApplication工程,添加对WMRMObjs.dll的引用,在本文章中工程命名为DRMLicenseGet。

2. License预发放程序代码编写:

Web.config:配置文件

<appSettings>
<!-- 私钥 -->
<add key="PrivateKey" value="!qYNXRckn69VzoSNmGJ9umMfgSw="/>
<!-- 公钥 -->
<add key="PublicKey" value="R76wg3M2nq3yDRWWI2hFESO*zRXNo2qcNdeVocH7cjwBSN!WnOi8Gg=="/>
<!-- 种子 -->
<add key="Seed" value="eQ50hSVGytB3IEr0Tr6UAUMEVlJfcD9XObjE8UhP"/>
</appSettings>

配置文件内配置的私钥、公钥、种子和上一篇文章内的信息相同。

GenerateLicense.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WMRMOBJSLib;
using System.Configuration; namespace DRMLicenseGet
{
public class GenerateLicense
{
/// <summary>
/// 生成License
/// </summary>
/// <param name="keyID">加密时使用的keyID</param>
/// <param name="Challenge">页面传过来的Challenge值</param>
/// <returns></returns>
public static string Generate(string keyID, string Challenge)
{
//从配置文件内获得私钥、公钥、种子和后发放License获取URL地址
string privateKey = ConfigurationManager.AppSettings["PrivateKey"];
string publicKey = ConfigurationManager.AppSettings["PublicKey"];
string seed = ConfigurationManager.AppSettings["Seed"]; //处理许可请求对象
WMRMChallenge myWMRMChallenge = new WMRMChallenge();
//管理内容头对象
WMRMHeader myWMRMHeader = new WMRMHeader();
//管理加密密钥和许可密钥种子对象
WMRMKeys myWMRMKeys = new WMRMKeys();
//指定加密内容的使用权限对象
WMRMRights myWMRMRights = new WMRMRights();
//创建许可对象
WMRMLicGen myWMRMLicGen = new WMRMLicGen();
//将许可递交给客户端对象
WMRMResponse myWMRMResponse = new WMRMResponse(); try
{
string strLicenseRequested = Challenge;
myWMRMChallenge.Challenge = strLicenseRequested; myWMRMKeys.KeyID = keyID;
myWMRMKeys.Seed = seed; #region 设置播放权限 //最小的安全级别
myWMRMRights.MinimumAppSecurity = 500;
//是否允许播放,false-不允许,true-允许
myWMRMRights.AllowPlay = true;
//是否允许在PC机上播放,0-不允许,1-允许
myWMRMRights.AllowPlayOnPC = 1;
//允许播放次数
myWMRMRights.Playcount = 2;
//是否允许拷贝,false-不允许,true-允许
myWMRMRights.AllowCopy = false;
//允许拷贝次数
myWMRMRights.CopyCount = 1;
//是否允许联合播放,false-不允许,true-允许
myWMRMRights.AllowCollaborativePlay = false;
//是否允许刻录,false-不允许,true-允许
myWMRMRights.AllowPlaylistBurn = false;
//最大刻录次数
myWMRMRights.MaxPlaylistBurnCount = 1;
//能刻录到光盘上的最大次数
myWMRMRights.PlaylistBurnTrackCount = 1;
//是否允许备份许可证,0-不允许,1-允许
myWMRMRights.AllowBackupRestore = 0;
//是否允许烧录到CD上,0-不允许,1-允许
myWMRMRights.AllowBurnToCD = 0;
//是否允许把已打包的流保存到磁盘上,0-不允许,1-允许
myWMRMRights.AllowSaveStreamProtected = 0;
////当客户端机器时间更改到更早时间时,该证书是否失效,0-不失效,1-失败
//myWMRMRights.DisableOnClockRollback = 1;
////当客户端机器时间更改到更早时间时,该证书是否自动删除,0-不删除,1-删除
//myWMRMRights.DeleteOnClockRollback = 1;
myWMRMRights.PMRights = 51;
myWMRMRights.PMAppSecurity = 150; #endregion myWMRMLicGen.KeyID = myWMRMKeys.KeyID;
myWMRMLicGen.SetKey("", myWMRMKeys.GenerateKey());
myWMRMLicGen.Rights = myWMRMRights.GetAllRights();
myWMRMLicGen.ClientInfo = myWMRMChallenge.ClientInfo;
myWMRMLicGen.Priority = 10; #region 添加版权信息 //版权
myWMRMLicGen.set_Attribute("Copyright", "Microsoft");
//类型
myWMRMLicGen.set_Attribute("ContentType", "Video");
//作者
myWMRMLicGen.set_Attribute("Author", "Terence");
//网站
myWMRMLicGen.set_Attribute("ArtistURL", "http://www.cnblogs.com/fanmenglife");
//标题
myWMRMLicGen.set_Attribute("Title", "Terence's Video");
//License提供商
myWMRMLicGen.set_Attribute("LicenseDistributor", "Terence");
//License提供商网站
myWMRMLicGen.set_Attribute("LicenseDistributorURL", "http://www.cnblogs.com/fanmenglife");
//内容提供商
myWMRMLicGen.set_Attribute("ContentDistributor", "Terence");
//等级
myWMRMLicGen.set_Attribute("Rating", "高级");
//描述
myWMRMLicGen.set_Attribute("Description", "Terence's Video"); #endregion myWMRMLicGen.BindToPubKey = publicKey; //生成License
string license = myWMRMLicGen.GetLicenseToDeliver();
myWMRMResponse.AddLicense("2.0.0.0", license);
return myWMRMResponse.GetLicenseResponse();
}
catch (Exception e)
{
return "";
}
}
}
}

IssueLicense.aspx:该文件只需在服务器端编写代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace DRMLicenseGet
{
public partial class IssueLicense : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//获取challenge值
string challenge = Page.Request.Params["challenge"];
//获取KeyID值
string keyID = Page.Request.Params["keyid"];
//获得License
string license = GenerateLicense.Generate(keyID, challenge);
//输出License
Page.Response.Write(license);
}
}
}
}

GetLicense.aspx:该页面为用户操作页面,不需要在服务器端编写代码

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetLicense.aspx.cs" Inherits="DRMLicenseGet.GetLicense" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title> <script language="javascript" type="text/javascript">
function GetLicense() {
try {
var url = "http://localhost:20103/IssueLicense.aspx?keyid=" + document.getElementById("txtKeyID").value;
licenseObj.GetLicenseFromURL("<a></a>", url); alert('许可证下载成功!');
}
catch (e) {
alert("许可证下载失败,错误信息:" + e.message);
return;
}
}
</script> </head>
<body>
<object name="licenseObj" classid="clsid:A9FC132B-096D-460B-B7D5-1DB0FAE0C062" id="licenseObj"
width="0">
</object>
<form id="form1" runat="server">
<div>
<input id="txtKeyID" type="text" value="请输入加密时使用的KeyID" onclick="this.value = '';" />
<input id="btnGetLicense" type="button" value="获取License" onclick="GetLicense()" /></div>
</form>
</body>
</html>

3.效果:

输入媒体文件加密时使用的Key,点击获取License,获取成功就可以播放媒体文件啦。

下一篇文章将介绍License后发放的实现。

谢谢,希望我的文章对大家有帮助!

文章源代码:

下载

[破解] DRM-内容数据版权加密保护技术学习(中):License预发放实现的更多相关文章

  1. [破解] DRM-内容数据版权加密保护技术学习(上):视频文件打包实现

    1. DRM介绍: DRM,英文全称Digital Rights Management, 可以翻译为:内容数字版权加密保护技术. DRM技术的工作原理是,首先建立数字节目授权中心.编码压缩后的数字节目 ...

  2. 基于隐私保护技术的DNS通信协议介绍

    本文提出了一种基于用户数据报协议的DNS传输中用户隐私保护的加密方法:DNSDEA.该方法采用PKI加密体系与DNS协议相融合,不仅解决了域名隐私保护问题,而且与传统DNS体系相兼容,保持了DNS系统 ...

  3. .NET 产品版权保护方案 (.NET源码加密保护) (转载)

    说 明:你希望自己用.net辛辛苦苦做出来的软件被人轻易破解吗?你希望自己花了大量人力物力用.net开发出来的产品被竞争对手轻易获取核心代码吗?这是 一篇比较详尽地介绍如何保护自己的.net源代码的文 ...

  4. [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护)

    [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护) 标签: .net加密产品c#dll工具 2011-03-24 21:06 27009人阅读 评论(13) 收藏 举报 分类: C ...

  5. Unity3D内容加密保护

    仅管资源 (Assets) 在传输时可使用加密进行保护,但在数据流入客户手中后.其内容就有可能被获取.比如,有工具可记录驱动程序级别上的 3D 数据,同意用户提取传送至 GPU 的模型和纹理. 因此, ...

  6. 网络安全——数据的加密与签名,RSA介绍

    一. 密码概述 发送者对明文进行加密然后生成密文,接受者再对密文解密得到明文的过程. 现在使用的所有加密算法都是公开的!但是密钥肯定不是公开的. 1 散列(哈希)函数 通常有MD5.SHA1.SHA2 ...

  7. 大型.NET商业软件代码保护技术 技术与实践相结合保护辛苦创造的劳动成果

    列举工作以来遇到的各种类型的软件所采用的代码保护技术,只讲原理不涉及技术细节实现,以避免产生法律问题.有些朋友说直接把代码放在Github开源下载,开源可以促进技术交流与进步,然而值钱的代码都积压在硬 ...

  8. [转] GCC 中的编译器堆栈保护技术

    以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞.由此引发的安全问题比比皆是.早在 1988 年,美国康奈尔大学的计算机科学系研究生莫里斯 (Morris) 利用 UNIX fingered 程序 ...

  9. GCC 中的编译器堆栈保护技术

    GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...

随机推荐

  1. 单源最短路径—Bellman-Ford和Dijkstra算法

    Bellman-Ford算法:通过对边进行松弛操作来渐近地降低从源结点s到每个结点v的最短路径的估计值v.d,直到该估计值与实际的最短路径权重相同时为止.该算法主要是基于下面的定理: 设G=(V,E) ...

  2. TypeScript 素描 - 模块解析、声明合并

    模块解析 模块解析有两种方式 相对方式  也就是以/或 ./或-/开头的,比如import jq  from "/jq" 非相对方式  比如 import model  from ...

  3. pyqt一个简单的动画

    import sys from PyQt4.QtGui import QApplication , QGraphicsEllipseItem , QGraphicsItemAnimationfrom ...

  4. JUnit4中的测试套件

    测试套件 JUnit3.8中,用测试套件同时运行多个测试类(http://www.cnblogs.com/mengdd/archive/2013/04/07/3006265.html). 在JUnit ...

  5. C#使用自定义字体(从文件获取)

    在进行软件开发,尤其是开发WinForm程序时,有时为了实现界面的美化,不可避免的需要使用一些特殊的字体,但是在开发完成之后,将程序移到其他的机器上时,由于这些机器可能没有安装相应的字体,所以整个界面 ...

  6. mycat实例(1)

    2016二月 22 置原 MyCat - 使用篇(1) 分类:数据库分库分表(Mycat等) (1126) (1) 数据库路由中间件MyCat - 使用篇(1) 基本概念 直接介绍概念太枯燥了,还是拿 ...

  7. iOS开发之让你的应用“动”起来

    概览在 iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互 式绘图,如何通过核心动画创建基础动画.关键帧动 ...

  8. LR脚本自定义显示Controller虚拟用户状态

    在场景监控的过程中,想知道场景运行时Vusers的运行状态以及每一个Vuser虚拟用户在本次场景运行的过程共迭代了多少次,那么就需要在VuGen脚本中自定义显示虚拟用户状态信息. 代码如下: stat ...

  9. C# 4.0 并行计算部分

    C# 4.0 并行计算部分   c#linq算法多线程list微软   目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...

  10. Unity脚本——Csharp

    打印输出: Debug.Log(""); 游戏流程函数: Awake():在对象被创建的时候调用. Start():在Awake()方法之后执行.在脚本禁用后不会执行. updat ...