ERP框架開發中的License許可驗證機制設計與實現 (包含源代碼下載)


許可機制是ERP框架中必不可少的一部分,可以有效的保護框架資源在授權范圍內應用,增加企業投資的回報。在研究了幾種類型的許可機制(序列號注冊碼,Web服務聯機驗證,授權License文件)后,最后選定以Signed Xml配合RSA算法,作為許可機制的主要技術實現。

主要達到的目的如下

1  可以實現版本控制。企業版可使用所有的功能,專業版只可用部分功能,個人版免費使用,但功能集更少。

public enum Version {  Enterprise, Professional, Personal }

2  功能點的控制上,同時在線用戶數量控制,帳套數量控制,硬件驗證控制,試用過期控制,虛擬機控制。

  • 在線用戶數量 可以控制同時在線的用戶數量,超過許可數量,則無法登陸
  • 帳套數量控制 比如,只可以建立10套帳,超過此限制則無法登陸
  • 硬件驗證控制 生成許可文件時,會綁定硬件信息(硬盤,CPU,內存,主板),以此硬件信息生成的許可文件,不可以在別的電腦上運行,以控制用戶數量。
  • 試用過期控制 超過期限則停止進入系統,有效阻止未授權用戶的繼續使用,收回投資
  • 虛擬機控制  因為虛擬機中安裝與還原操作系統非常容易方便,我們常以此來試用軟件,當軟件試用到期后還想繼續用,則只需要的還原一下虛擬機中的系統,則可以繼續體驗。以此選項,控制軟件不可以運行於虛擬機中。常見的虛擬機即VMware Workstation和Virtual PC。

以此理論,設計如下格式的License.lic文件,以作為要頒發的許可證文件。

image

 

在程序編寫過程中,參考了CodeProject網站中的文章

Using XML Digital Signatures for Application Licensing - CodeProject
http://www.codeproject.com/Articles/4940/Using-XML-Digital-Signatures-for-Application-Licen

幾乎就是對這篇文章的定制,就可以完成以上所需要達到的目的。以下分享幾個遇到的實際問題,供您參考。

1 Xml序列時,元素的順序。通過Google得知,請仔細閱讀以下的幾段話。

XmlSerializer takes all fields in the order that they are declared.
the order problem on the Compact Framework.Unfortunately, this is by Design.

The order of elements serialized by the NETCF xml serializer is not
guaranteed to match that of the desktop. There is nothing in the generated
schema class included in the attached project that specifies the order of
the elements.

In order to accomplish this you should add the /order option to xsd.exe and
then regenerate the schema class
(xsd.exe /order /c foo.xsd)

By doing this all the particle members will have their explicit order
identifiers and then the serializer will honor the order of the schema. The
new schema generated by with the /order switch will have the orders
property specified on the XmlElementAttribute
e.g. [System.Xml.Serialization.XmlElementAttribute(Order = 2)]

Xml序列化以元素聲明的順序,但是Compack Framework不一樣,需要手動指定它們的順序。

 

2 硬件信息的集成綁定

這應該是一個名值對,比如

CPU: Intel Pentium T440

Hard Driver: WD Elements

所以,需要設計一個List<HardwareInfo>,或是繼承於CollectionBase。

public struct HardwareInfo 
{  
public string HardwareId { get;set;} 

public string Description { get;set;}

}

這個List<T>要可以序列化,它要綁定到License.lic文件中。

 

3 類型中,有些對象不需要序列化的,要加上標簽以阻止序列化。

[NonSerialized]
private string _hashValue;

4  生成公鑰和私匙配對,然后放到代碼中去。生成的內容如下

  public static string PrivateKey
        {
            get
            {
                return "<BitStrength>1024</BitStrength><RSAKeyValue><Modulus>uCMDxXTd0bNbiAFrOYjbiGyQpqfZY2Znn70hoQZsprNoXV8tSZ6mM8VswoTNh6S+0qfYntzxpQq29mqv+8mUIuGN/30YpUq9tZFR1bIHEJnPqSRHcQa0ezimTilBN7EN7J6wnQBQqFyt3ZRnLYUsRta1Vjdn4eEc50Q4EfEOlO8=</Modulus><Exponent>AQAB</Exponent><P>99QWQo0ulkBCDyHwL3amXKahDSmcGa3bJHz23M++65jtxYp0LViGH+ngr5FYSxp7oAj37dKTiw4h6NO/+J6amw==</P><Q>vjVO29oMfKynSHZgRIeRhcInt6ReHm19of8YIsvBVYgasg9qi0lONFUvmW51fPrXdTPWz4fHmlnv3leWN7AaPQ==</Q><DP>tiyKHGvJthsQNC1/cHRogCzgsFtI6zt4no7ZrKFtt6PYDODk27x6A5WZW5Wc8MBL5e0RyxmC6bH+zTZypGB6Rw==</DP><DQ>Rr/bYkl75Y/u9TQa4MKwbVlnnpZD7/t4BJ63IpI5ipACpgK39bFBppOdDewZRXCkXdL3buApbY9QepqHpJUbXQ==</DQ><InverseQ>zZu/5jmI8PSbo1e6nXfaAtzZQiSUO0q3D1Dm30w51lukRw8OlkmrMOszLF7LontM/4kLhmri2BU5yeTChppXLQ==</InverseQ><D>q5JsrCqlmQRfEA4KY9Siga5u5epWA2liupOW5xw+VuGqJ/5MC2HZCTo2idUGURJvf4dHr1a9jgO60UY9bgW4kWOkLdZ3xzn0wqYyt/VCdvQE1qH/YnVEeLUZqjrbH14Zw8isR2Yxf33QCFfvHWTqIvwtm0ZdniH+cEIRgEwsPNk=</D></RSAKeyValue>";
            }
        }

        public static string PublicKey
        {
            get
            {
                return "<BitStrength>1024</BitStrength><RSAKeyValue><Modulus>uCMDxXTd0bNbiAFrOYjbiGyQpqfZY2Znn70hoQZsprNoXV8tSZ6mM8VswoTNh6S+0qfYntzxpQq29mqv+8mUIuGN/30YpUq9tZFR1bIHEJnPqSRHcQa0ezimTilBN7EN7J6wnQBQqFyt3ZRnLYUsRta1Vjdn4eEc50Q4EfEOlO8=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
            }
        }

公鑰只可以拿來驗證許可文件,私匙可以驗證,但主要的是用來生成Xml文件簽名。

 

5 請注意License文件的最后一個節,它放的是綁定的硬件信息,這一節信息是加密的。為了可以解密,這里用RSA算法。這個過程如下,用戶試用軟件,申請許可文件,給用戶一個EXE文件程序,用於生成hardware.id文件,然后用戶將此文件發給軟件公司,軟件公司依據此文件,向用戶發放試用許可文件。

 string hardware = RSACryptionHelper.EncryptString(inputString, publicKey);

當用戶將綁定有硬件信息的許可拿到別的電腦上運行時,會報異常

 if ((configuration.Items.Count == 0) && (this.LicenseType == LicenseType.Enterprise))
    {
        throw new LicenseException("Hardware fingerprint is missing in license file");
    }

 

6  許可類型

public enum  LicenseType
{  
   Internal,
   Enterprise,
   Professional,
   Personal
}

所有類型的license都會過期,在license中指定的ExpiredDate之后,都將無法運行。所以沒有加Trial類型的許可。

我手頭有個數據庫工具軟件,還有800多天的試用期,可還可使用2年多一點。IT這個行業既很傳統,10年的技術,C#.NET WinForms技術,現在還在普及使用中,又很超前,大量的新技術,新知識注入到這個行業中。

2年的時間內可以做很多事,看很多書,走很多路,且行且看。

 

7  Signed Xml技術的要點主要是明文查看,但可以防止篡改。眼睜睜的看着2013-5-30號就過期了,你就是沒有辦法把它改成2100-5-30號。這一下子可以100年后,你改了,這企業再也不能從你這里收取費用,可怎么養活程序員呢。

但是,有兩個軟件可以做到一個,就是篡改系統的當前時間,然后注入到你的進程中。推薦軟件RunAsDate。這軟件的功能強大,可以設置當前時間,然后啟動軟件。如果你試用一個很好的軟件,又不想付費,也找不到Cracker或是KEY的話,可以試下這個辦法。

image

 

8   ExpiryDate是2013-5-30時,但是到了這一天,用戶把時間又改回到2013-4-30號,又可以繼續試用一個月。對於這個問題,也要處理。對於MIS/ERP類型的軟件,也可以不用處理。對數據的主要要求之一是准確,現在是5-2號了,你把時間改回到4-2號,繼續使用軟件,系統的日記帳時間也是4-2號。以后查帳的時候,這是很嚴重的問題。5-2號的進倉單,實際對應的是系統中的4-2號的單據,很不方便與追蹤問題。

如果要控制用戶改時間,則需要記住用戶第一次使用系統的時間,發現用戶系統時間,直接報錯,異常退出。

<IssuedDate>2013-04-30T10:58:52.5456701+08:00</IssuedDate>
<ExpiryDate>2013-05-30T23:59:59.997</ExpiryDate>

 

請到如下的網頁中下載源代碼,供您參考。

Using XML Digital Signatures for Application Licensing - CodeProject
http://www.codeproject.com/Articles/4940/Using-XML-Digital-Signatures-for-Application-Licen


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM