Skip to main content

Visual Basic .Net (VB.Net) 程式語言案例學習 (11. 產品序號產生器)

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

image.png
圖 11‑1

11.7 修改重點

如同一開始所提出的方法,修改成網路版的動態序號,會比較符合經濟效益。因為方便修改,移植這序號產生的函式到ASP.NET是相當容易的一件是,就技術上並無大礙,時間上也比較有效率。

除此之外,將序號編碼產生有意義的字元,也是一種資訊隱藏的方式。有些序號會獲得硬碟的ID,或是作業系統的種類,其實這些技巧已經非常普遍了,但序號最終目的還是為了防止盜版,讓原版使用者獲得好的服務。因此,序號若有其他用途,可能也只是將資訊隱藏,藉由解碼而獲得資訊。

增加合理性判斷也是一種好方法,透過有條理的流程,能夠多少防堵一些不合法的序號註冊,例如:取得註冊電腦IP位址,加以編碼為英文字母,而後當註冊者的IP位址與序號不同時,就可以判讀出序號流出。

為了怕產生的序號可能有重複,可先將序號排序,而後兩兩比對,若有重複則上下筆資料必會相同,這時就可以替除其中一筆。不過基本上要產生相同的序號機會實在很小,特別是使用GUID的方式產生序號,幾乎是遇不上重複時後。

11.8 結論

動態序號的方式目前有許多軟體是採用這種模式,因為方便控制安裝數量,透過網路也能夠確實掌握使用狀況,例如:譯典通系列(國內著名的中英日翻譯軟體)。它可以透過網頁獲得新的註冊序號,再進行註冊。而且透過更新字典,也方便統計下載新字典的次數,同等於啟用譯典通軟體的次數。這是一個影響層度跟友善度的一個平衡點,其實只要做到對使用者影響最小的保護原版方式,通常是最能夠被大眾所接受的。所以最終還是回歸到市場決定機制,由市場來決定哪一種保護模式最被大眾所接受,而非以技術模式來決定。

image.png
Lai Tai-Yu (賴岱佑)

Popular posts from this blog

Python 日期與時間的處理

Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Python 日期與時間的處理

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)

Image

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Image

數位影像處理:最佳化處理策略之快速消除扭曲演算法

Image

用10種程式語言做影像二值化(Image binarization)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (04. 人事考勤管理系統)

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (06. 題庫測驗系統)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (11. 生產線拍照程式)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (07. 收據列印程式)

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (03. 場地預約系統)

Image