軟體序列號生成組件SoftwareProtector
在文章:這些.NET開源項目你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Software Protector序列號生成組件。今天就通過一篇簡單的文章來預覽一下其強大的功能。雖然我人為其已經基本滿足了一個軟體序列號的所有要素,但至於大家用不用得上,還得看大家的需求。總的來說,其源碼並不複雜的,即使要增加功能,也可以使用其進行擴展。何苦,就我而言,雖然以前也做過簡單的序列號註冊和驗證,但看完這個之後,自己真的是太天真了。以前也簡直是弱爆了,所以某種意義上,這個組件的功能是很強大的。
1.基本功能介紹
說簡單的,這個東西就是序列號生成器,用來保護應用程序的授權的。可以生成和驗證不同類型的序列號(20位),能限制時間(最多999天),還能夠鎖定特定機器的key。這個組件是GUI界面,內核使用的是SKGL(Serial Key Generating Library)組件。所以使用的時候還是一起吧,地址如下:
官方網站:http://softwareprotector.codeplex.com/
http://skgl.codeplex.com/
看看界面所演示的功能截圖:
如果選擇了鎖定機器,就只能在指定機器碼上的電腦用了,下面是驗證序列號的截圖:
下面來簡單看看核心的SKGL源代碼以及使用情況。
2.核心的SKGL源碼分析
對SKGL源碼的分析,由於總共代碼量很少,實際的代碼量只有260行,所以我對這個源代碼進行了簡單的翻譯,特別是主要核心方法的功能,便於理解。後面我們將提供製作好的CHM幫助文檔,供使用參考。SKGL中總共有5個類,其中比較核心的只有3個類,另外2個是抽象基類以及內部核心方法。所以主要看看3個核心類:
2.1 SerialKeyConfiguration類
SerialKeyConfiguration是序列號配置類,繼承自BaseConfiguration抽象配置基類。其主要作用是存儲機器碼,以及生成序列號說需要的一些特徵欄位。目前配置裡面默認有8個特徵配置項,通過選擇不同的配置特徵項,可以更加靈活生成序列號加密方案。SerialKeyConfiguration作為核心類,在序列號的生成和驗證中都有用到。
2.2 Generate類
Generate類也是繼承BaseConfiguration的類,作用是根據配置類生成說需要的序列號。裡面有密鑰的設置,以及生成序列號的核心函數doKey,裡面的邏輯也不是很複雜,主要是根據需要生成的類型,如時間限制,是否有機器碼來進行判斷,然後調用內部方法來生成序列號。
2.3 Validate類
Validate類也是繼承BaseConfiguration類,因為驗證是一個解密的逆向過程,也需要用到配置相關的項。類的主要作用是驗證序列號是否合法,是否過期等功能,也是要調用核心的內部類進行解密。總體來說思路是很簡單的,關於具體的實現過程,暫時沒必要深究,可以查看源代碼進行詳細的理解。
3.SKGL核心功能調用
這個組件一個是核心類,1個是非常成熟可以直接使用的UI界面,UI界面的代碼是http://VB.NET,很簡單。這裡我將演示幾種使用方法,來調用核心的SKGL組件來完成序列號的生成和解密功能。使用之前添加引用,新建項目這些東西就不必說了。直接進入主題吧。
1.創建Key
創建key使用Generate類,主要有3個重載方法,下面的例子很簡單的進行了演示,看代碼注釋即可理解。
//1.創建key生成對象var CreateAKey = new Generate();//2.設置密鑰CreateAKey.secretPhase = "testdemo";//3.生成key,30天時間限制var key1 = CreateAKey.doKey(30);//4.還可以設置機器碼以及設置起始日期,機器碼是1個5位Int數var key2 = CreateAKey.doKey(30, 61125);Console.WriteLine("Key 1 :"+key1);Console.WriteLine("Key 2 :"+key2);
結果如下,第2個key使用了本機的機器碼,我們在下面的代碼中將進行驗證:
Key 1 :MFZIL-NSTBB-DLLXZ-RFHYVKey 2 :JPVFS-BLQOQ-FLFTN-HXLFW
2.驗證Key
驗證key是一個逆向過程,使用Validate類,我們使用上面代碼生成的key和配置來進行驗證。代碼如下,具體看注釋:
//1.創建key驗證對象var ValidateAKey = new Validate();//2.設置密鑰ValidateAKey.secretPhase = "testdemo";//3.設置要驗證的key,注意,這是上面代碼生成的key1內容ValidateAKey.Key = "MFZIL-NSTBB-DLLXZ-RFHYV"; //4.直接驗證是否被修改Console.WriteLine("Key 1 驗證:{0}" , ValidateAKey.IsValid);//5.檢查key是否過期,false說明在有效期內Console.WriteLine("Key 1 有效期:{0}", ValidateAKey.IsExpired);//同樣驗證Key2ValidateAKey.Key = "JPVFS-BLQOQ-FLFTN-HXLFW";//檢查密鑰是否被修改Console.WriteLine("Key 2 驗證:{0}", ValidateAKey.IsValid);//我電腦的實際機器碼是 61125,所以結果是不一樣的Console.WriteLine("Key 2 是否和當前機器的機器碼一樣:{0}", ValidateAKey.IsOnRightMachine);
結果如下:
Key 1 驗證:TrueKey 1 有效期:FalseKey 2 驗證:TrueKey 2 是否和當前機器的機器碼一樣:False
如上圖可以驗證密鑰是否修改,以及是否過期,以及對應的機器碼是否和本機一樣。在實際使用中,如果要鎖定機器,必須先獲得機器碼,然後生成對應的才行。
3.高級應用之特徵值
在源代碼以及上面的解說中,我們提到了,在SKGL中,有一個特徵碼屬性:Features,是1個長度為8的布爾數組。它有什麼作用呢?
簡單的說,設置這個屬性,可以讓你定義密鑰的使用在不同的環境或者版本中。例如應用程序發布後,可能會有試用版,個人版,專業版等等不同版本。實際使用的時候就可以拿出其中的位來設置是否是某一個版本,或者某一個功能類型。SKGL在實際的驗證中,也會對這些特徵進行驗證,從而根據序列號的類型來使用對應的功能。下面我們使用1個簡單的例子,演示如何使用這個特徵碼屬性。這個屬性需要在生成或者驗證的配置對象中進行設置:
3.1 配置生成對應版本的Key
比如8個特徵碼,選擇其中1個設置是否為時間限制的試用版。如下面代碼和注釋:
//配置對象SerialKeyConfiguration skc = new SerialKeyConfiguration(); //生成key對象Generate CreateAKey = new Generate(skc);//string trialKey = CreateAKey.doKey(30); //試用版30天期限//創建1個有時間限制的試用版skc.Features = new bool[8] { true, false, false, false,false, false,false ,false };// 當然這裡的版本可以自定義,只要你自己認識就行了
這裡設置的位置的意義,在自己的程序中你認識就行了。
3.2 解密獲取Key的特徵功能
下面是對應的一個解密後驗證功能的代碼例子:
//配置對象SerialKeyConfiguration skc = new SerialKeyConfiguration();//驗證對象Validate ValidateAKey = new Validate(skc);ValidateAKey.Key = textBox4.Text; // 對比輸入的序列號{ if (ValidateAKey.IsValid)//如果沒有被修改 { //驗證特徵碼是否符合某些版本的特徵 if (ValidateAKey.Features[0] == false) { //TODO: } if (ValidateAKey.Features[0] == true) { //TODO: } //TODO: } else { //TODO: }}
總的來說,這個組件基本功能都滿足了,非常值得一用。至於思路,大家可以做成網站驗證或者生成註冊碼的。自己寫一個其實也挺費勁的,在一般的軟體中是足夠了。
5.資源
源碼不複雜,在學習過程中,就順便把它給翻譯了。所以這裡奉獻我翻譯後的源代碼以及Demo,以及製作的幫助文檔。上個圖:
翻譯後的源碼與Demo,託管在Github,我不會告訴你網址在這裡的:https://github.com/asxinyu/SKGL
推薦閱讀:
※C#泛型(MSIL)的內部是怎麼實現的?
※.net最適合做什麼?
※零基礎新手求推薦C#.net的書?
※Node.js和.Net 4.5下的await、async相比有什麼不同?
※有哪些好的.net項目開發案例的書籍或者資源可以推薦?