Microsoft .Net的應(yīng)用程序的代碼文件,與Java生成的文件類似,它們都沒有本地代碼,而是一種類似于匯編的代碼。這樣,只要有合適的工具,就可以完整的把別人寫出來的程序反編譯成自己需要的程序文件。
我所知道的.Net下的反匯編程序是
Salamander
和
Refelector
兩個(gè)工具,他們都可以對(duì).Net的程序集反編譯成你需要的語言。
那么,我們寫的程序,做的項(xiàng)目,如何進(jìn)行正版的許可證管理,有許多方法。
最好的方案,是幾個(gè)方法的綜合。下面我說一下單獨(dú)的許可驗(yàn)證方法。
最簡(jiǎn)單的方法,就是使用許可存儲(chǔ)。方法是用戶輸入正版的注冊(cè)碼,通過程序中專門的算法程序進(jìn)行驗(yàn)算,得出的結(jié)果與事先保存在程序中的結(jié)果比對(duì),比對(duì)一致表示輸入正確。然后把結(jié)果保存在存儲(chǔ)中,如注冊(cè)表或者專門的許可文件中,程序許可通過。
這個(gè)方法使用的人/公司最多,但是缺點(diǎn)也是最多的,只要使用上面的工具把驗(yàn)算注冊(cè)碼的算法給弄清楚,就可以自己寫一個(gè)生成序列號(hào)的注冊(cè)機(jī),這個(gè)注冊(cè)方法就形同虛設(shè)了。
還有一個(gè)比較好的方法,就是仿照WindowsXP的激活機(jī)制,客戶的程序自動(dòng)訪問互聯(lián)網(wǎng)的一個(gè)專門設(shè)定的服務(wù)器,通過Tcp/Ip或者WebService遠(yuǎn)程訪問服務(wù)器上的許可程序,許可后把結(jié)果保存在客戶端計(jì)算機(jī)上。這個(gè)方法的好處是許可驗(yàn)證代碼保存在開發(fā)者控制的計(jì)算機(jī)上,客戶端無法獲取驗(yàn)證算法,而且可以通過數(shù)據(jù)庫管理用戶,非常方便。
但是這個(gè)方法也有缺點(diǎn),首先是可靠的Internet連接。如果要防止用戶使用盜版,則必須在客戶端的程序中添加一個(gè)隨機(jī)訪問遠(yuǎn)程許可服務(wù)器驗(yàn)證的功能,這樣不但需要一個(gè)24小時(shí)的Internet連接,而且經(jīng)常進(jìn)行驗(yàn)證也會(huì)干擾程序的正常運(yùn)行。還有就是如果有人通過研究客戶端的接收返回信息的代碼,弄一個(gè)虛擬的驗(yàn)證服務(wù)器,這個(gè)功能也會(huì)完蛋。
那么,所有的焦點(diǎn)都聚集在客戶端的驗(yàn)證算法上,只要這個(gè)客戶端的驗(yàn)證算法被人弄清楚了,整個(gè)程序的許可可以說就不存在了,所以許多開發(fā)者/開發(fā)公司費(fèi)好大的力氣,弄一個(gè)足夠復(fù)雜的驗(yàn)證算法出來,用算法的復(fù)雜度來抵抗破解。但是再復(fù)雜的算法,只要有人寫得出來,就有人能破解得出來,這個(gè)道理我想大家都明白。
那是否有加密算法與解密算法不同的辦法呢?有。而且.Net自帶的類庫里面就有這個(gè)算法。
這個(gè)算法的原理是不對(duì)稱加密的原理。不對(duì)稱加密原理大家基本上都了解。加密的密碼(密鑰)分為兩個(gè)部分,公鑰和私鑰。通過私鑰加密的密文只能通過公鑰解密。根據(jù)這個(gè)特性,我們可以發(fā)現(xiàn)只要開發(fā)者保存好私鑰,即使算法代碼被客戶端破解,因客戶端不知道保存在開發(fā)者處的私鑰,也無法生成注冊(cè)碼。
這個(gè)算法就是
System.Security.Cryptography
名稱空間的
RSAPKCS1SignatureFormatter
類(用來生成注冊(cè)碼)和
RSAPKCS1SignatureDeformatter
類(用來在客戶端驗(yàn)證注冊(cè)碼)。驗(yàn)證過程如下:
首先,需要生成一個(gè)公鑰和私鑰對(duì),當(dāng)然,依靠人是無法生成的,我們可以通過
System.Security.Cryptography
名稱空間的
RSACryptoServiceProvider
類來生成公鑰/私鑰對(duì)。
獲取私鑰以后,可以用 RSAPKCS1SignatureFormatter 類來生成注冊(cè)碼,代碼如下(引用名稱空間略)
上面的代碼是一個(gè)示例aspx頁面的代碼,頁面包括一個(gè)id為msg的Label控件,一個(gè)ID為txtIn的TextBox控件,一個(gè)ID為btnOK的Button控件,上面的代碼就是btnOK的事件處理程序的內(nèi)容。大家可以非常清楚的看出處理流程,生成一個(gè)RsaCryptoServiceProvider類實(shí)例,然后把這個(gè)類實(shí)例的加密密鑰指定為包含私鑰的prikey字符串因?yàn)榧用芙饷艿墓€/私鑰必須是對(duì)應(yīng)的。然后獲取txtIn輸入的內(nèi)容,生成密鑰后在msg控件上顯示。
下面是使用 RSAPKCS1SignatureDeformatter 類來驗(yàn)證輸入:
上面的代碼也很好理解,就是多了一個(gè)ID為txtKey的TextBox控件,他通過同時(shí)獲取用戶名/加密密鑰來進(jìn)行驗(yàn)證。重點(diǎn)是RSA類的FromXmlString()方法,注意上面的這個(gè)方法獲取的是公鑰,表示這段驗(yàn)證代碼是保存在客戶端的,客戶端代碼是沒有私鑰的,即使有人把程序集的代碼反編譯了也沒有用。
上面兩段代碼需要注意的就是生成的公鑰/私鑰必須匹配,我使用RSA對(duì)象生成密鑰對(duì)后保存成為字符串常量,就可以解決這個(gè)問題。
上面這個(gè)方法仍然無法解決客戶使用ildasm反編譯后暴力修改IL代碼,只有靠可靠的強(qiáng)名稱以及數(shù)字證書來保證程序集不被修改了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

