专栏首页葡萄城控件技术团队Silverlight4控件纯客户端注册验证

Silverlight4控件纯客户端注册验证

本文实现了一个实验性的Silverlight控件纯客户端注册验证机制。希望做过这方面的朋友多给些指导性意见。

先给大家介绍一下Silverlight客户端控件的使用情景。一般来说,Silverlight客户端控件会销售给开发Silverlight程序的公司,他们是控件的购买者。他们开发的程序中会用到Silverlight客户端控件。但是Silverlight控件最终是在浏览Silverlight程序的网站用户机器上执行的。说的有点绕,请参照下图。

这个纯客户端注册验证机制主要流程如下: 1, 控件购买者下载使用Silverlight控件(Silverlight控件中包含PublicKey及验证License的逻辑)。 2, 控件购买者通过控件生成商提供的网站输入一些注册信息(如输入程序部署路径等唯一标示),付费,完成注册。控件生成商会记录这些信息,并使用PrivateKey生成一个RSA签名过的License文件。 3, 控件生产商会将这个RSA签名过的License文件返回给控件购买者。 4, 控件购买者会将License文件绑定到他开发部署的程序中。 5, 网站用户浏览控件购买者开发部署的网站,下载Silverlight控件在网站用户机器上执行,并验证License文件的签名及程序部署路径等唯一标识。

License格式如下:

<License>
  <Id>31f81fef-a036-4f6f-b47b-d0c8da1674ea</Id>
  <AssemblyName>Vendor.TestControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=696fd0988622108f</AssemblyName>
  <AuthorisedApp>http://localhost:8888/ClientBin/Customer.TestApp.xap</AuthorisedApp>
  <Signature>MVALuQLzIK8SWfZ5q25/PD3P6ZV0FLqIhCt5YcZ7yNkBTuLABg/TGggC4imU2S6QyZBOLsXyEOSFfXXxBn7Spwhkr6P+CbQb0MvotPgr5nenLdccm7UwABkn7+PgtEchObGba5KUhHCAkvvSFfwi/e480AYI2YXznVpCsP8RA8o=</Signature>
</License>

License中记录了控件生成商数据库中License信息记录Id,强名称签名的目标控件程序集全名,程序部署路径等一些唯一性标示及防止篡改这些信息的RSA数字签名。

当用户浏览网站时,Silverlight控件会下载到在用户机器上执行,从而进行注册码验证工作。它会首先验证License的合法性(即使用RSA签名验证算法检验License文件是否被篡改),然后会判断程序集及唯一性标示是否正确。从而判断控件是否成功注册

验证License合法性代码如下:

    public class License
    {
        private static readonly string PublicKeyXmlString = "<RSAKeyValue><Modulus>wG5DRppiesQegis92ZyJOO3ADC6ANV470SPyOhuYBpDpwA/UX4gO3XQhEr2jx09ZLQWYvwVJdSg4JhoO46fw11nsQObzwd+wz/jEcjSF9MCfK+CVb3qMHH9TBgHh5dy7zbB+hUkuacm/nKY9bPfaoNj4sA2YnbiPl3+v80qy/gE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
        private static readonly RSAManaged.RSAPublicKey PublicKey = null;
        static License()
        {
            PublicKey = RSAManaged.RSAPublicKey.FromXmlString(PublicKeyXmlString);
        }

        internal License()
        {
        }

        internal string Id { get; set; }
        public string AssemblyName { get; internal set; }
        public string AuthorisedApp { get; internal set; }
        internal byte[] Signature { get; set; }

        public bool IsValid()
        {
            //在这里验证License是否合法
            byte[] signData = Encoding.UTF8.GetBytes(this.Id + this.AssemblyName + this.AuthorisedApp);
            SHA1Managed sha1 = new SHA1Managed();
            bool verifyResult = RSAManaged.RSAManaged.Verify(signData, PublicKey, sha1, this.Signature);
            sha1.Clear();
            return verifyResult;
        }

验证程序集全名及程序部署路径等唯一性标示代码如下:

        private static bool ValidateLicenseFile()
        {
            AssemblyName assemblyName = new AssemblyName(Application.Current.GetType().Assembly.FullName);
            Uri uri = new Uri("/" + assemblyName.Name + ";component/license.lic", UriKind.Relative);
            StreamResourceInfo sri = Application.GetResourceStream(uri);
            if (sri == null)
            {
                return false;
            }

            string licenseXmlString = new StreamReader(sri.Stream).ReadToEnd();
            License license = License.FromXmlString(licenseXmlString);
            if (license == null || !license.IsValid())
            {
                return false;
            }

            //在这里验证程序集全名是否合法
            if (Assembly.GetExecutingAssembly().FullName != license.AssemblyName)
            {
                return false;
            }

            //在这里验证程序部署路径等唯一性标示
            if (Application.Current.Host.Source.AbsoluteUri != license.AuthorisedApp)
            {
                return false;
            }

            return true;
        }

优点:     +使用私钥签名,公钥验证,能有效防止伪造License文件及分析代码写出注册机(不考虑篡改程序逻辑的爆破方式)。     +纯客户端验证不需要跨域访问,也不需要控件购买者在程序发布服务器端部署其他东西。

缺点:     -比直接输入注册码麻烦     -在现在的Silverlight版本中,只找到部署地址这个特征标示,因此只能做部署License授权。不能做成像WinForm控件那样为每个开发人员机器授权的方式。

另外,关于RSA算法和实现可以参考之前的一篇文章:《Silverlight中非对称加密及数字签名RSA算法的实现》。

欢迎大家给些意见。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你应该知道的15个Silverlight诀窍

    我热爱Silverlight,并且身体力行写了很多Silverlight程序,也讨论了很多关于Silverlight的技术。对于刚刚接触Silverlight的...

    葡萄城控件
  • 分享自制的C#和VB Code互转工具

    作为.NET程序员,往往习惯使用一种语言(据我观察,2006年后的程序员习惯用C#,之前的喜欢VB)。而对于另一种语言虽然能读懂但是写起来总是比较费事。尤其面对...

    葡萄城控件
  • 如何为IDE注册第三方Silverlight控件

    为IDE注册第三方Silverlight控件,相对WinForm平台下第三方控件的注册,较为复杂。这里结合实际,给出一个相对方便的解决方案,欢迎讨论。 先看结果...

    葡萄城控件
  • 自动驾驶Apollo源码分析系列感知篇(六):车道线Dark SCNN算法及车道线后处理代码简述

    车道线检测是 ADAS 领域和高级别自动驾驶都非常重要的一环,属于环境感知和定位中的核心项。 人可以轻易分辨道路上的车道线,但是对于机器而言,却非常的难,人脑...

    Frank909
  • 基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0

    Java架构师历程
  • 过了这一关,你就能成为光荣的人民教师了!

    教师是世间最伟大的职业,不仅是人类科学的传播者,还是学生智力的开发者,被称为「人类灵魂的工程师」。

    知晓君
  • 车道线检测在AR导航中的应用与挑战

    现代社会中,随着车辆的普及,人的活动范围在逐步扩大,单单依靠人类记忆引导行驶到达目的地已经越来越不切实际,因此车载导航就扮演了越来越重要的角色。

    3D视觉工坊
  • CurcveLane-NAS:华为&中大提出一种结合NAS的曲线车道检测算法

    论文地址:http://arxiv.org/pdf/2007.12147v1.pdf

    AI算法修炼营
  • ORA-12519: TNS:no appropriate service handler found 解决方法

      今天客户在使用导入Excel功能时,由于底层的数据库连接层框架是自己公司研发的,导致出现问题

    彼岸舞
  • 【Science】MIT研究长期记忆神经回路,海马体和新皮层记忆同时产生

    【新智元导读】MIT 4月6日在 Science 上发表的一篇论文对基于记忆过程的神经回路进行了研究,首次揭示出记忆在海马体和新(大脑)皮层中的长期储存是同时形...

    新智元

扫码关注云+社区

领取腾讯云代金券