許可機制是ERP架構中必不可少的一部分,可以有效保護架構資源在授權範圍內應用,增加企業投資的回報。在研究了幾種類型的許可機制(序號註冊碼,Web服務聯機驗證,授權License檔案)後,最後選定以Signed Xml配合RSA演算法,作為許可機制的主要技術實現。
主要達到的目的如下
1 可以實現版本控制。企業版可使用所有的功能,專業版只可用部分功能,個人版免費使用,但功能集更少。
public enum Version { Enterprise, Professional, Personal }
2 功能點的控制上,同時線上使用者數量控制,帳套數量控制,硬體驗證控制,試用到期控制,虛擬機器控制。
- 線上使用者數量 可以控制同時線上的使用者數量,超過許可數量,則無法登陸
- 帳套數量控制 比如,只可以建立10套帳,超過此限制則無法登陸
- 硬體驗證控制 產生許可檔案時,會綁定硬體資訊(硬碟,CPU,記憶體,主板),以此硬體資訊產生的許可檔案,不可以在別的電腦上運行,以控制使用者數量。
- 試用到期控制 超到期限則停止進入系統,有效阻止未授權使用者的繼續使用,收回投資
- 虛擬機器控制 因為虛擬機器中安裝與還原作業系統非常容易方便,我們常以此來試用軟體,當軟體試用到期後還想繼續用,則只需要的還原一下虛擬機器中的系統,則可以繼續體驗。以此選項,控制軟體不可以運行於虛擬機器中。常見的虛擬機器即VMware Workstation和Virtual PC。
以此理論,設計如下格式的License.lic檔案,以作為要頒發的許可證檔案。
在程式編寫過程中,參考了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的話,可以試下這個辦法。
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