• DRM内容数据版权加密保护技术学习(中):License预发放实现 (转) dodo


    在上一篇文章里实现了对媒体文体的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.效果:

    image

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

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

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

    文章源代码:

    下载

  • 相关阅读:
    Spring bean作用域
    软件类说明文档排版建议
    fit_line_contour_xld拟合直线的五种算法的准确度比较
    .Net优秀开源(5)SqlSugar
    .NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法
    spring框架学习(14)AOP(中)
    .Net优秀开源(4)Castle.Core
    .Net优秀开源(3)Dapper
    .Net优秀开源(2)Autofac
    .Net优秀开源(1)
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/2241543.html
Copyright © 2020-2023  润新知