1. 程式人生 > >一篇文章通透理解序列號實現原理

一篇文章通透理解序列號實現原理

                     

1.序列號的本質

序列號等價於註冊碼,是軟體發行商的一種維權手段,也就是正版軟體的一個身份證。本質:防止盜版、按功能收費等。 目前,商用軟體和共享軟體絕大部份都是採用註冊碼授權的方式來保證軟體本身不被盜用,以保證自身的利益。儘管很多常用的許多軟體系統的某些版本已經被別人破解,但對於軟體特殊行業而言,註冊碼授權的方式還是一種保護軟體系統本身的一種有效的手段。 序列號一般會和產品的名稱(具體到硬體產品的型號、軟體產品的版本號)、產品的使用期限(具體到截止日期)一起釋出。 以下是一款我曾經試用過的美國軟體產品Silver-peak註冊碼/序列號申請回復郵件的全文:

Hello,The license key for your Silver Peak trial is ready to
be installed.  This is one of two mails you will receive with unique license keys.  Deploy the Silver Peak Virtual Appliance you downloaded at each end of the WAN link you plan to optimize.  Once deployed, install the unique license key below on one appliance and the unique license key from the second email on
the other appliance to enable optimization. Product: VX-2000License Key:P6F0-lBmL-34Pm-IZ3m-3MGL-s2ND-eLKC-+3pe-HROq-VMGQ-spH/-kOBb-LJOV-QC3p-nPw1-OJGy-KUem-egFc-sXWB-uDwm-goPa-gw==Your license will expire on: Mon Jan 19 2015Before you start your trial, we recommend you visit the Silver Peak Marketplace website and
read the ‘Getting Started’ page: http://marketplace.silver-peak.com/products/vx-virtual-software/vx-2000.html If you have any questions about installing and configuring your virtual appliance, you can contact the Silver Peak support team directly.  The support team can be reached in one of three ways:Via the support center at http://www.silverpeaksystems.com/support/portal_login.asp (you should have received an email with instructions on how to enable your account)By phone at 877-210-7325 / 408-935-1850By email at [email protected]-peak.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.序列號/註冊碼的原理

一般是以計算機硬體(如主機板,網絡卡,硬碟)的唯一序列號作為註冊源,通過一定的演算法(即註冊機)形成所謂的註冊碼。一般的程式通過在程式中設定一個全域性變數來進行註冊碼的記錄。 Windows下次數可以在登錄檔裡設定一個鍵值來判斷,若有此鍵,則說明已經到期。(網上說法,個人感覺不可靠,因為登錄檔也可以修改。) 一般情況下軟體的註冊是通過比較來實現的,也就是說軟體本身就是註冊機,因為他本身就有個真正的註冊碼,用他來和你所輸入的註冊碼做比較。不過有的是明碼比較有的是加密比較,以明碼比較來說:我們已經知道了軟體自己可能會產生註冊碼的有的在記憶體中有的在軟體中有的在登錄檔中,更有甚者是有個通用的萬能註冊碼。  輸入註冊碼成功是因為軟體中用了跳轉,也就是說。當你輸入的號碼和真正的註冊碼比較完的時候有個跳轉。 大部分註冊演算法的原理是:軟體或者使用者自己觸發了軟體的註冊模組軟體跳轉到註冊認證模組。彈出註冊視窗使用者輸入註冊名+註冊碼A,把它們存放在記憶體中。然後軟體的註冊碼驗證部分根據使用者輸入的註冊名生成正確的註冊碼B並和使用者輸入的註冊碼A做對比。如果結果為相同則註冊通過,並執行“註冊成功”後面的程式分支,比如解除各種軟體限制。如果不相同則提示“無效的註冊碼,請重新輸入!”或者“Invalid key!”等等警告。如下圖所示: 這裡寫圖片描述 圖 1 註冊截圖 原理摘自:http://blog.csdn.net/jacky_think/article/details/4565241

3.註冊碼/序列號授權分類

通常而言,註冊碼授權方式有以下幾種方式: (1)安裝序列號方式 這是最為常用的方式,Mircosoft提供的產品(例如:Windows系列產品、Office系列產品等等)都是採用這種方式。通過一種複雜的演算法生成安裝序列號,在安裝過程中,安裝程式對使用者輸入的安裝序列號進行校驗來驗證該系統是否被合法,從而完成授權。 這裡寫圖片描述 圖 2 Windows安裝序列號方式 (2)使用者名稱+序列號方式 即軟體系統的供應商給使用者提供有效的使用者名稱和序列號,使用者在安裝過程或啟動過程中輸入有效的使用者名稱和序列號,系統通過演算法校驗通過後完成軟體授權。 這裡寫圖片描述 圖 3 使用者名稱+序列號方式 (3)線上註冊方式 使用者安裝系統後,通過網路進行註冊授權。軟體系統的供應商事先已經登記了使用者的資訊,使用者線上註冊時,供應商的註冊系統對使用者的資訊進行驗證。使用者身份有效時,註冊系統生成一個憑證資訊,軟體系統根據憑證資訊完成授權。 這裡寫圖片描述 圖 4 線上註冊方式

(4)啟用碼方式 使用者安裝系統後,軟體系統會根據使用者機器的關鍵資訊(例如:MAC地址、CPU序列號、硬碟序列號等等)生成一個註冊憑證(也可稱為註冊碼),使用者將這個註冊憑證傳送給軟體供應商,供應商通過註冊憑證生成一個啟用碼。使用者輸入啟用碼,軟體系統完成授權。  這裡寫圖片描述 圖 5 啟用碼方式

4.註冊碼/序列號組成

(1)產品版本:限定具體到哪個版本、同產品的其他版本不能用。 (2)到期時間:限定截止服務執行時間,到給定截止前一週會有介面提示和郵件提醒。 (3)唯一標識:限定一個軟體產品和MAC地址或者磁碟UUID(linux系統)/GUID(Windows系統)繫結。 (4)預留欄位:用於分模組限定核心功能、分模組收費等。 以下是Silver-peak產品序列號使用期限截止前一週前郵件提示全文: Hello, This is to notify you that the Proof of Concept currently in process at [email protected] will expire on  Wed Jan 21 2015. This affects the following appliances, shipped on Mon Dec 22 2014:         VX-2000, S/N 001BBC03A8E9         VX-2000, S/N 001BBC03A8EA If you have questions, please contact your account executive (Tricia Png, [email protected]). Thank you, Silver Peak Systems

5.獲取機器的唯一標識

上面的分析可知,我們的軟體肯定要安裝到硬體裝置上,為了管控亂拷貝現象或盜版使用現象,必須獲取硬體裝置的唯一標識。通過該唯一標識生成註冊碼/序列號。 有了裝置的唯一編號,我們就可以實現更好的軟體的授權機制,還可以利用它來限制客戶端軟體訪問後臺服務的許可權,從而提高系統的安全性。 通用唯一識別碼(英語:Universally Unique Identifier,簡稱UUID)是一種軟體建構的標準,亦為自由軟體基金會組織在分散式計算環境領域的一部份。 UUID的目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要通過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人衝突的UUID。在這樣的情況下,就不需考慮資料庫建立時的名稱重複問題。目前最廣泛應用的UUID,是微軟公司的全域性唯一識別符號(GUID),而其他重要的應用,則有Linux ext2/ext3檔案系統、LUKS加密分割槽、GNOME、KDE、Mac OS X等等。另外我們也可以在e2fsprogs包中的UUID庫找到實現。 UUID是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平臺會提供生成的API。按照開放軟體基金會(OSF)制定的標準計算,用到了全域性唯一的IEEE機器識別號、納秒級時間、晶片ID碼和許多可能的數字。 如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同(實際測試結果每次都不同)。即每次生成的UUID都是不同的。 UUID由以下幾部分的組合:

  • 1 全域性唯一的IEEE機器識別號。(如果有網絡卡,從網絡卡MAC地址獲得;沒有網絡卡,以其他方式獲得)
  • 2 納秒級時間
  • 3 晶片ID碼
  • 4 許多可能的數字

UUID的唯一缺陷在於生成的結果串會比較長。關於UUID這個標準使用最普遍的是微軟的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函式很簡單地生成UUID,其格式為:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每個x是0-9 a-f 範圍內的一個十六進位制的數字。而標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)

5.1不同作業系統裝置的唯一標識

(1)Windows系統GUID 全域性唯一識別符號,簡稱GUID(發音為/ˈɡuːɪd/或/ˈɡwɪd/),是一種由演算法生成的唯一標識,通常表示成32個16進位制數字(0-9,A-F)組成的字串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它實質上是一個128位長的二進位制整數。GUID一詞有時也專指微軟對UUID標準的實現。 GUID的主要目的是產生完全唯一的數字。在理想情況下,任何計算機和計算機叢集都不會生成兩個相同的GUID。GUID的總數也足夠大,達到了2128(3.4×1038)個,所以隨機生成兩個相同GUID的可能性是非常小的,但並不為0。所以,用於生成GUID的演算法通常都加入了非隨機的引數(如時間),以保證這種重複的情況不會發生。 [維基百科]  https://zh.wikipedia.org/wiki/%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80%E6%A0%87%E8%AF%86%E7%AC%A6

(2)Linux系統UUID Linux UUID的作用及意義 原因1:它是真正的唯一標誌符 UUID為系統中的儲存裝置提供唯一的標識字串,不管這個裝置是什麼型別的。如果你在系統中添加了新的儲存裝置如硬碟,很可能會造成一些麻煩,比如說啟動的時候因為找不到裝置而失敗,而使用UUID則不會有這樣的問題。 原因2:裝置名並非總是不變的 自動分配的裝置名稱並非總是一致的,它們依賴於啟動時核心載入模組的順序。如果你在插入了USB盤時啟動了系統,而下次啟動時又把它拔掉了,就有可能導致裝置名分配不一致。 使用UUID對於掛載移動裝置也非常有好處──例如我有一個24合一的讀卡器,它支援各種各樣的卡,而使用UUID總可以使同一塊卡掛載在同一個地方。 原因3:ubuntu中的許多關鍵功能現在開始依賴於UUID

5.2獲取唯一標識方法

(1)Windows系統機器或者Linux系統機器獲取方法 這裡寫圖片描述 圖 6 Windows機器的Guid 這裡寫圖片描述

圖 7 Linux機器的uuid Windows系統&Linux系統獲取uuid統一通用程式碼(已經測試過,測試結果見上面截圖):

#include <stdio.h>#include <string>#include <iostream>#ifdef WIN32#include <objbase.h>#else#include <uuid/uuid.h>#endifusing namespace std;#define MAX_LEN 128/***@brief: get windows guid or linux uuid**@return: string type windows guid or linux uuid*/string GetGuid(){    char szuuid[MAX_LEN] = {0};#ifdef WIN32    GUID guid;    CoCreateGuid(&guid);    _snprintf_s(        szuuid,        sizeof(szuuid),        "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",        guid.Data1, guid.Data2, guid.Data3,        guid.Data4[0], guid.Data4[1],        guid.Data4[2], guid.Data4[3],        guid.Data4[4], guid.Data4[5],        guid.Data4[6], guid.Data4[7]);#else    uuid_t uuid;    uuid_generate(uuid);    uuid_unparse(uuid, szuuid);#endif    return std::string(szuuid);}int main(){    string strGuid  = GetGuid();    cout << strGuid.c_str() << endl;    return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

(2)安卓手機裝置(沒有驗證) DEVICE_ID 這是Android系統為開發者提供的用於標識手機裝置的串號,也是各種方法中普適性較高的,可以說幾乎所有的裝置都可以返回這個串號,並且唯一性良好。 這個DEVICE_ID可以同通過下面的方法獲取: TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String DEVICE_ID = tm.getDeviceId(); 它會根據不同的手機裝置返回IMEI,MEID或者ESN碼,但在使用的過程中有以下問題: 非手機裝置:最開始搭載Android系統都是手機裝置,而現在也出現了非手機裝置:如平板電腦、電子書、電視、音樂播放器等。這些裝置沒有通話的硬體功能,系統中也就沒有TELEPHONY_SERVICE,自然也就無法通過上面的方法獲得DEVICE_ID。 許可權問題:獲取DEVICE_ID需要READ_PHONE_STATE許可權,如果只是為了獲取DEVICE_ID而沒有用到其他的通話功能,申請這個許可權一來大才小用,二來部分使用者會懷疑軟體的安全性。 廠商定製系統中的Bug:少數手機裝置上,由於該實現有漏洞,會返回垃圾,如:zeros或者asterisks 【參考】http://my.oschina.net/596179991/blog/619242

5.3不使用MAC 地址作為唯一標識的原因

(1)有的Windows、Linux裝置或者虛擬機器可能沒有網絡卡。 (2)對於安卓裝置 可以使用手機Wifi或藍芽的MAC地址作為裝置標識,但是並不推薦這麼做,原因有以下兩點: 硬體限制:並不是所有的裝置都有Wifi和藍芽硬體,硬體不存在自然也就得不到這一資訊。 獲取的限制:如果Wifi沒有開啟過,是無法獲取其Mac地址的;而藍芽是隻有在開啟的時候才能獲取到其Mac地址。

6.關於破解&安全性

不論是採用哪種方式來進行授權,理論上都是可以被破解的。只要破解者發現了軟體授權機制和原理則任何保護機制都將化為烏有。因此,只能夠通過選擇複雜的演算法和機制來增加破解者的破解難度,從而在在一定的時間內保證軟體不被盜用。 RSA演算法(非對稱加密演算法)是一個廣泛用於加密和數字簽名的演算法,可以適用使用者名稱+序列號、線上註冊、啟用碼等軟體保護方式。 RSA演算法是第一個能同時用於加密和數字簽名的演算法,也易於理解和操作。RSA也是被研究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。 【參考RSA實現軟體註冊碼原理】http://blog.csdn.net/scollins/article/details/5694306 設想的使用者使用序列號的流程及可能存在的問題: 這裡寫圖片描述 圖 8 使用者使用序列號流程 (1)聯機驗證是一種很好的防止破解的方法 優點:簡單、高效、直觀。 缺點:針對軟體的使用客戶情況不同,部分客戶是內網機器,無法連線外網,也就無法聯網驗證。 (2)關於序列號拷貝問題 之前採用過一種方法,如果涉及兩臺裝置(服務端、客戶端)之間通訊的,可以通過如下判定禁用複製序列號、修改Mac地址的情況。 這裡寫圖片描述 圖 9 通訊的角度中斷序列號複製問題 (3)UUID的弊端 如果將一臺機器的UUID拷貝到另一臺機器,就類似修改Mac地址的方法達到欺騙的目的。 由於目前沒有找到通過UUID反推Mac地址的方法。設想的解密那裡只能通過解密到UUID,不能繼續解析到Mac地址或者磁碟UUID。 複雜一勞永逸的解決方案:UUID不通過系統生成,自己寫演算法生成。這樣生成和解析都可控。 簡單的解決方案:假定裝置都裝了網絡卡,通過實際網絡卡(非虛擬網絡卡)的Mac地址充當裝置UUID。 安全性問題的以上3點需要花時間研究。

7.構想的序列號生成方案

下圖是生成序列號與反查序列號介面截圖(構想)。 這裡寫圖片描述 圖 10 序列號生成軟體 下圖是序列號生成流程圖(構想)。 第一步:通過5.2(1)方法獲取安裝裝置的UUID,如: 9d669361-7f8a-4f97-b08a-488e4a92ee52;該UUID應該儲存在裝置的軟體安裝路徑一份,以備對比驗證。 第二步:填寫對應安裝的軟體版本號,如1.0.0.1; 第三步:填寫使用或授許可權定使用的期限,如3年。 第四步:點選生成序列號生成授權序列號(後臺會呼叫RSA加密演算法,對輸入內容進行加密)。 這裡寫圖片描述 圖 11 序列號生成流程圖 下圖2是序列號驗證邏輯流程圖(構想)。 第一步:輸入獲取的序列號。  第二步:後臺執行RSA解密序列號。 第三步:判定各個屬性值和安裝裝置是否一致。 第四步:全部相同確定為有效序列號,可以放行軟體功能許可權。 這裡寫圖片描述

圖 12序列號驗證邏輯流程圖

8.參考

2016-3-23 pm21:22 思於家中床前