控件注册验证机制探索 License


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

 


207084CB-0.jpg

 


 



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


 


这个验证性Demo中的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合法性代码如下:


207084CB-1.jpg 207084CB-2.jpg 代码

     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;
        }

 


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


207084CB-3.jpg 207084CB-4.jpg 代码

         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控件那样为每个开发人员机器授权的方式。


     http://www.th7.cn/Article/bc/SilverLight/201001/372893.html(原文)

转载于:https://my.oschina.net/dyg540/blog/85024

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值