推薦+1置頂+1(分享、討論、實(shí)現(xiàn))
創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、網(wǎng)站建設(shè)網(wǎng)站策劃,項目實(shí)施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元沾益做網(wǎng)站,已為上家服務(wù),為沾益各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
通用軟件注冊功能之建立有效的軟件保護(hù)機(jī)制
眾所周知,一些共享軟件往往提供給使用者的是一個功能不受限制的限時使用版,在試用期內(nèi)使用者可以無限制的使用軟件的全部功能(只是可能會出現(xiàn)提示使用者注冊的窗口),試用期一過部分(或全部)功能失效,要想繼續(xù)使用只能向作者索取注冊碼(或注冊文件)完成對軟件的合法注冊,注冊后的軟件將解除一切使用限制。如果您也開發(fā)出一個有價值的作品,是否也希望為自己的軟件增加一個這樣的功能呢?當(dāng)前對于.NET反編譯的問題不在本文討論之內(nèi),相關(guān)文章已經(jīng)很多!本文我們就一起探討軟件注冊功能的實(shí)現(xiàn)。
實(shí)現(xiàn)軟件的注冊功能方法很多,最需要考慮的就是不能輕易的讓使用者破解,在這里,我就談?wù)?ldquo;.NET快速開發(fā)整合框架(RDIFramework.NET)”中平臺注冊功能的實(shí)現(xiàn)方法。在RDIFramework.NET中,注冊功能主要方法就是對計算機(jī)唯一硬件信息進(jìn)行RSA數(shù)字簽名達(dá)到軟件注冊和保護(hù)的功能,該方法實(shí)現(xiàn)簡單,安全性相應(yīng)較高。
計算機(jī)唯一硬件信息(我們知道計算機(jī)中的關(guān)鍵部件如CPU,主板等在全球范圍內(nèi)都有一個獨(dú)一無二的產(chǎn)品序列號,用戶通過注冊模塊獲取這些產(chǎn)品序列號(即傳統(tǒng)所說的:機(jī)器嗎)并將它發(fā)送給軟件開發(fā)商要求進(jìn)行RSA數(shù)據(jù)簽名,軟件開發(fā)商獲得這些機(jī)器碼后利用手中的私鑰對這些信息進(jìn)行RSA數(shù)字簽名,生成的簽名信息(即注冊碼)發(fā)回給用戶,用戶將收到的注冊碼輸入注冊模塊的注冊碼框,軟件即可利用公鑰執(zhí)行簽名驗證,如果輸入的注冊碼被證明就是經(jīng)過開發(fā)商數(shù)字簽名的機(jī)器碼,則完成注冊過程。
注冊功能項目結(jié)構(gòu)圖如下所示:
圖1 注冊功能項目結(jié)構(gòu)
平臺服務(wù)端注冊碼生成主界面如下所示:
圖2 注冊文件管理器
通過“注冊文件管理器”,我們就可以根據(jù)用戶提供的信息來生成軟件的注冊文件。
客戶端的注冊主要就是根據(jù)我們提供的注冊文件與公鑰,來驗證注冊文件是否為當(dāng)前客戶的有效注冊文件,如果有效,注冊成功,無效則注冊失敗!客戶端注冊功能設(shè)計參考如下所示:
圖3 平臺注冊
用戶單擊“注冊”按鈕,成功注冊提示:
圖4注冊成功
服務(wù)端注冊碼生成核心代碼:
一、 生成公/私鑰文件:
1 private void btnGenerateKey_Click(object sender, EventArgs e) 2 { 3 if (MessageBox.Show("確定生成生成公/私鑰對嗎(是/否)?", "詢問信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) 4 == System.Windows.Forms.DialogResult.Cancel) 5 { 6 return; 7 } 8 9 RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();10 11 string publicKey = crypt.ToXmlString(true);12 string privateKey = crypt.ToXmlString(false);13 crypt.Clear();14 15 //生成公鑰 16 using (StreamWriter sw = new StreamWriter(KeyPath + "RDIFrameworkkey.key", false, UTF8Encoding.UTF8))17 {18 sw.Write(SecretHelper.AESEncrypt(publicKey));19 sw.Flush();20 }21 22 //生成私鑰 23 using (StreamWriter sw = new StreamWriter(KeyPath + "RDIFrameworkPrivateKey.key", false, UTF8Encoding.UTF8))24 {25 sw.Write(SecretHelper.AESEncrypt(privateKey));26 sw.Flush();27 } 28 29 MessageBox.Show("成功生成公/私鑰對!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);30 }
二、 生成注冊文件:
1 private void btnGenerateRegisterFile_Click(object sender, EventArgs e) 2 { 3 if (string.IsNullOrEmpty(txtUserEmail.Text.Trim())) 4 { 5 MessageBox.Show("用戶郵箱不能為空!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); 6 txtUserEmail.Focus(); 7 return; 8 } 9 else 10 {11 if (!RegexValidatorHelper.IsMatch(txtUserEmail.Text.Trim(), Pattern.EMAIL))12 {13 MessageBox.Show("郵箱格式不正確!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);14 txtUserEmail.SelectAll();15 return;16 }17 }18 19 if (string.IsNullOrEmpty(txtCPUSerialNo.Text.Trim()))20 {21 MessageBox.Show("CPU序列號不能為空!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);22 return;23 }24 25 if (!string.IsNullOrEmpty(txtUseLimited.Text.Trim()))26 {27 if (!RegexValidatorHelper.IsMatch(txtUseLimited.Text.Trim(), Pattern.INTEGER))28 {29 MessageBox.Show("使用次數(shù)應(yīng)該為數(shù)值型!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);30 txtUseLimited.SelectAll();31 return;32 }33 }34 35 //讀取私鑰 36 StreamReader sr = new StreamReader(KeyPath + "RDIFrameworkPrivateKey.key", UTF8Encoding.UTF8); 37 string keypair = sr.ReadToEnd();38 sr.Close();39 40 //用私鑰參數(shù)初始化RSACryptoServiceProvider類的實(shí)例crypt。 41 RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();42 43 crypt.FromXmlString(SecretHelper.AESDecrypt(keypair));44 45 UTF8Encoding enc = new UTF8Encoding();46 47 string trialTime = "30";//試用次數(shù)(默認(rèn):30數(shù),0:表示永久) 48 if (!string.IsNullOrEmpty(txtUseLimited.Text.Trim()))49 {50 trialTime = txtUseLimited.Text.Trim();51 }52 string regInfo = txtUserEmail.Text.Trim() + ";" + txtMAC.Text.Trim() + ";" + txtCPUSerialNo.Text.Trim() + ";" + trialTime;53 54 byte[] bytes = enc.GetBytes(regInfo);//格式:郵箱地址;MAC;CPU序列號;試用時間55 //對用戶信息加密 56 bytes = crypt.Encrypt(bytes, false);57 58 //生成注冊數(shù)據(jù),對二進(jìn)制字節(jié)進(jìn)行Base64編碼,但采用注冊文件的形式的進(jìn)修也可以不做此轉(zhuǎn)化。 59 string encrytText = System.Convert.ToBase64String(bytes, 0, bytes.Length);60 61 //將注冊碼寫入文件 62 using (StreamWriter sw = new StreamWriter(KeyPath + "RDIFramework_reg_file.lic", false, UTF8Encoding.UTF8))63 {64 sw.Write(encrytText);65 sw.Flush();66 }67 68 MessageBox.Show("注冊文件:RDIFramework_reg_file.lic生成成功!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 69 }
三、 驗證注冊文件:
1 private void btnCheckRegistr_Click(object sender, EventArgs e) 2 { 3 //讀取注冊數(shù)據(jù)文件 4 StreamReader sr = new StreamReader(KeyPath + "RDIFramework_reg_file.lic", UTF8Encoding.UTF8); 5 string encrytText = sr.ReadToEnd(); 6 sr.Close(); 7 8 9 //讀取公鑰 10 StreamReader srPublickey = new StreamReader(KeyPath + "RDIFrameworkkey.key", UTF8Encoding.UTF8);11 string publicKey = srPublickey.ReadToEnd();12 srPublickey.Close();13 14 //用公鑰初化始RSACryptoServiceProvider類實(shí)例crypt。 15 RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();16 crypt.FromXmlString(SecretHelper.AESDecrypt(publicKey));17 UTF8Encoding enc = new UTF8Encoding();18 byte[] decryptByte;19 try 20 {21 byte[] newBytes;22 newBytes = System.Convert.FromBase64CharArray(encrytText.ToCharArray(), 0, encrytText.Length);23 decryptByte = crypt.Decrypt(newBytes, false);24 string decrypttext = enc.GetString(decryptByte);25 // 26 //TODO:在此處添加驗證邏輯27 //28 MessageBox.Show(decrypttext);29 }30 catch(Exception ex)31 {32 MessageBox.Show(ex.Message);33 }34 }
至此,軟件的注冊功能就完成了,當(dāng)然還有其他很多方法,比如:
一、 采用加密狗的方式(最安全的方式)。 二、 在線驗證注冊信息(用戶需能上網(wǎng)),這種方式也比較可靠。 三、 其他方法,歡迎大家討論。 四、 ......
作者: EricHu 出處:http://blog.csdn.net/chinahuyong 微博: 騰訊Email: 406590790@qq.com QQ 交流:406590790 平臺博客: 【CSDN】http://blog.csdn.net/chinahuyong 【CNBLOGS】http://www.cnblogs.com/huyong 關(guān)于作者:高級工程師、信息系統(tǒng)項目管理師、DBA。專注于微軟平臺項目架構(gòu)、管理和企業(yè)解決方案,多年項目開發(fā)與管理經(jīng)驗,曾多次組織并開發(fā)多個大型項目,精通DotNet,DB(SqlServer、Oracle等)技術(shù)。熟悉Java、Delhpi及Linux操作系統(tǒng),有扎實(shí)的網(wǎng)絡(luò)知識。在面向?qū)ο?、面向服?wù)以及數(shù)據(jù)庫領(lǐng)域有一定的造詣。現(xiàn)從事DB管理與開發(fā)、WinForm、WCF、WebService、網(wǎng)頁數(shù)據(jù)抓取以及ASP.NET等項目管理、開發(fā)、架構(gòu)等工作。 如有問題或建議,請多多賜教! 本文版權(quán)歸作者和CNBLOGS博客共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過郵箱或QQ 聯(lián)系我,非常感謝。