Visual Basic .Net (VB.Net) 程式語言案例學習 (11. 產品序號產生器)
Visual Basic .Net (VB.Net) 程式語言案例學習 (11. 產品序號產生器)¶
11.1 問題¶
產品序號最主要的條件就是不能重複,因為序號重複廠商就不知道哪一套才是正版的,辨識的方法就得改採其他模式。除此之外,序號若是藉由一套規則而產生的話,還可以自行加入關鍵碼、驗證碼,加強序號的安全性。不過大量不重複的序號,要怎麼產生呢?這是我們探討的問題,至於序號的安全性、辨識方法則不是我們討論的主題。
序號至少是目前最普遍的一種原版保護方式,透過網路還可以產生對應的效果來查核是否為盜版。簡單的做法就是紀錄產品的序號於伺服器,當客戶端有新安裝的產品,就必須連上網路與伺服器上的序號做匹配或是比對,驗證通過後才可以使用該產品。可是問題來了,若有兩三台電腦註冊的序號都是相同時,遠在各地,廠商不可能禁止任何一台電腦使用,因為廠商不知道哪一台才是真的有原版,而且也無從連絡,除非購買軟體還必須登記姓名及電話,但那也太麻煩了。
因此動態的序號會比較有效,也就是當有新安裝的產品上線註冊時,系統確認是正確的序號後,立即發給一組新的序號,爾後就此用新的序號來註冊,也就是說每註冊一次就會獲得一個新的序號,而舊序號就不能再繼續使用了。這種方式在網路普遍的時代中,算是一個比較中庸且有效的做法。因為還是無法防止盜版的問題,但卻又能禁止到大多數普通的盜版行為。在還沒有百分之百防盜版的技術出現之前,廠商們只能選擇既不麻煩使用者,又多少能夠防堵盜版的方法。
11.2 需求¶
表格 11‑1 「產品序號產生器」系統目的分析表
版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
---|---|---|
能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
要能夠自動產生序號。 | 可自訂批次產生序號。 | |
可自訂序號的長度。 | ||
序號產生要避免重複。 | ||
不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
序號中可以加入驗證碼。 | 序號可建立網路驗證機制。 | |
序號中可加入隱藏資訊。 |
表格 11‑2 「產品序號產生器」系統目標分析表
版本: | 重要 | 不重要 |
---|---|---|
優先 | (重) | (急) |
要能夠自動產生序號。 | 可自訂序號的長度。 | |
序號產生要避免重複。 | ||
不急迫 | (輕) | (緩) |
無。 | 無。 |
表格 11‑3 「產品序號產生器」系統規格表
規格項目 | 規格內容 | 備註 |
---|---|---|
主要功能 | 要能夠自動產生序號。 | … |
序號產生要避免重複。 | ||
使用介面 | 可自訂序號的長度。 | … |
11.3 特色¶
特點就是提供兩種函式,讓您自行產生序號。提供亂數產生及GUID產生函式。
11.4 使用工具¶
語言 | 軟體 |
---|---|
Visual Basic 2005 | MS Visual Studio 2005 .NET |
11.5 系統架構¶
主要以兩個序號產生的函式,透過亂數以及GUID的方式產生序號,本程式按一次鈕只會產生一組序號,其實透過函式不斷的呼叫,可以產生一定數量的序號,您可以自訂一個迴圈範圍,自行產生足夠的序號。而序號長度也是透過字元刪減或是字元計數來控制的,這都寫在函式中,您可以在程式實作的部分中了解。
11.6 程式實作¶
‘使用數字及英文字母加上亂數產生序號的函式 Public Function RandomSN(ByVal Length As Integer) As String ‘宣告並設定空的初始值 Dim RndString As String = String.Empty ‘宣告整數變數 Dim Zero, Nine, A, Z, Count, RandNum As Integer ‘宣告亂數物件 Dim oRandom As New Random(System.DateTime.Now.Millisecond) ‘設定ASCII Code的數值範圍,數字部分由0~9,英文部分由大寫A~Z Zero = Asc("0") Nine = Asc("9") A = Asc("A") Z = Asc("Z") ‘使用迴圈判斷是否字串長度已足夠,不足夠則繼續產生 While (Count < Length) ‘使用Next方法產生該設定範圍的亂數 RandNum = oRandom.Next(Zero, Z) ‘當所產生的數值符合範圍內 If (((RandNum >= Zero) And (RandNum <= Nine) Or _ (RandNum >= A) And (RandNum <= Z))) Then ‘字串累加新產生的字元,而字元是透過Chr函式轉碼而成的 RndString = RndString + Chr(RandNum) ‘字元長度計數器累加一 Count = Count + 1 End If End While ‘傳回新產生的序號 Return RndString End Function ‘使用GUID替代序號的產生函式 Public Function GUIDRandomSN(ByVal length As Integer) As String ‘利用GUID產生新的編碼 Dim guidResult As String = System.Guid.NewGuid().ToString() ‘用取代的方式將減號去除掉 guidResult = guidResult.Replace("-", String.Empty) ‘檢查使用者要求的字元長度是否有問題 If length <= 0 OrElse length > 32 Then MessageBox.Show("序號長度必須在到32之間") End If ‘依照設定好的字元長度,傳回序號 Return guidResult.Substring(0, length) End Function
圖 11‑1
11.7 修改重點¶
如同一開始所提出的方法,修改成網路版的動態序號,會比較符合經濟效益。因為方便修改,移植這序號產生的函式到ASP.NET是相當容易的一件是,就技術上並無大礙,時間上也比較有效率。
除此之外,將序號編碼產生有意義的字元,也是一種資訊隱藏的方式。有些序號會獲得硬碟的ID,或是作業系統的種類,其實這些技巧已經非常普遍了,但序號最終目的還是為了防止盜版,讓原版使用者獲得好的服務。因此,序號若有其他用途,可能也只是將資訊隱藏,藉由解碼而獲得資訊。
增加合理性判斷也是一種好方法,透過有條理的流程,能夠多少防堵一些不合法的序號註冊,例如:取得註冊電腦IP位址,加以編碼為英文字母,而後當註冊者的IP位址與序號不同時,就可以判讀出序號流出。
為了怕產生的序號可能有重複,可先將序號排序,而後兩兩比對,若有重複則上下筆資料必會相同,這時就可以替除其中一筆。不過基本上要產生相同的序號機會實在很小,特別是使用GUID的方式產生序號,幾乎是遇不上重複時後。
11.8 結論¶
動態序號的方式目前有許多軟體是採用這種模式,因為方便控制安裝數量,透過網路也能夠確實掌握使用狀況,例如:譯典通系列(國內著名的中英日翻譯軟體)。它可以透過網頁獲得新的註冊序號,再進行註冊。而且透過更新字典,也方便統計下載新字典的次數,同等於啟用譯典通軟體的次數。這是一個影響層度跟友善度的一個平衡點,其實只要做到對使用者影響最小的保護原版方式,通常是最能夠被大眾所接受的。所以最終還是回歸到市場決定機制,由市場來決定哪一種保護模式最被大眾所接受,而非以技術模式來決定。
Lai Tai-Yu (賴岱佑)