序列號等價于注冊碼,是軟件發行商的一種維權手段,也就是正版軟件的一個身份證。本質:防止盜版、按功能收費等。
目前,商用軟件和共享軟件絕大部份都是采用注冊碼授權的方式來保證軟件本身不被盜用,以保證自身的利益。盡管很多常用的許多軟件系統的某些版本已經被別人破解,但對于軟件特殊行業而言,注冊碼授權的方式還是一種保護軟件系統本身的一種有效的手段。
序列號一般會和產品的名稱(具體到硬件產品的型號、軟件產品的版本號)、產品的使用期限(具體到截止日期)一起發布。
一般是以計算機硬件(如主板,網卡,硬盤)的唯一序列號作為注冊源,通過一定的算法(即注冊機)形成所謂的注冊碼。一般的程序通過在程序中設置一個全局變量來進行注冊碼的記錄。
Windows下次數可以在注冊表里設置一個鍵值來判斷,若有此鍵,則說明已經到期。(網上說法,個人感覺不可靠,因為注冊表也可以修改。)
一般情況下軟件的注冊是通過比較來實現的,也就是說軟件本身就是注冊機,因為他本身就有個真正的注冊碼,用他來和你所輸入的注冊碼做比較。不過有的是明碼比較有的是加密比較,以明碼比較來說:我們已經知道了軟件自己可能會產生注冊碼的有的在內存中有的在軟件中有的在注冊表中,更有甚者是有個通用的萬能注冊碼。
輸入注冊碼成功是因為軟件中用了跳轉,也就是說。當你輸入的號碼和真正的注冊碼比較完的時候有個跳轉。
大部分注冊算法的原理是:軟件或者用戶自己觸發了軟件的注冊模塊軟件跳轉到注冊認證模塊。彈出注冊窗口用戶輸入注冊名+注冊碼A,把它們存放在內存中。然后軟件的注冊碼驗證部分根據用戶輸入的注冊名生成正確的注冊碼B并和用戶輸入的注冊碼A做對比。如果結果為相同則注冊通過,并運行“注冊成功”后面的程序分支,比如解除各種軟件限制。如果不相同則提示“無效的注冊碼,請重新輸入!”或者“Invalid key!”等等警告。如下圖所示:
圖 1 注冊截圖
原理摘自:http://blog.csdn.net/jacky_think/article/details/4565241
通常而言,注冊碼授權方式有以下幾種方式:
(1)安裝序列號方式
這是最為常用的方式,Mircosoft提供的產品(例如:Windows系列產品、Office系列產品等等)都是采用這種方式。通過一種復雜的算法生成安裝序列號,在安裝過程中,安裝程序對用戶輸入的安裝序列號進行校驗來驗證該系統是否被合法,從而完成授權。
圖 2 Windows安裝序列號方式
(2)用戶名+序列號方式
即軟件系統的供應商給用戶提供有效的用戶名和序列號,用戶在安裝過程或啟動過程中輸入有效的用戶名和序列號,系統通過算法校驗通過后完成軟件授權。
圖 3 用戶名+序列號方式
(3)在線注冊方式
用戶安裝系統后,通過網絡進行注冊授權。軟件系統的供應商事先已經登記了用戶的信息,用戶在線注冊時,供應商的注冊系統對用戶的信息進行驗證。用戶身份有效時,注冊系統生成一個憑證信息,軟件系統根據憑證信息完成授權。
圖 4 在線注冊方式
(4)激活碼方式
用戶安裝系統后,軟件系統會根據用戶機器的關鍵信息(例如:MAC地址、CPU序列號、硬盤序列號等等)生成一個注冊憑證(也可稱為注冊碼),用戶將這個注冊憑證發送給軟件供應商,供應商通過注冊憑證生成一個激活碼。用戶輸入激活碼,軟件系統完成授權。
圖 5 激活碼方式
(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 XXX@163.com 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, tpng@silver-peak.com).
Thank you,
Silver Peak Systems
上面的分析可知,我們的軟件肯定要安裝到硬件設備上,為了管控亂拷貝現象或盜版使用現象,必須獲取硬件設備的唯一標識。通過該唯一標識生成注冊碼/序列號。
有了設備的唯一編號,我們就可以實現更好的軟件的授權機制,還可以利用它來限制客戶端軟件訪問后臺服務的權限,從而提高系統的安全性。
通用唯一識別碼(英語: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由以下幾部分的組合:
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)
(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。
【長度縮減可以Base64編碼】
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
(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> #endif using 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;
}
(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
(1)有的Windows、Linux設備或者虛擬機可能沒有網卡。
(2)對于安卓設備
可以使用手機Wifi或藍牙的MAC地址作為設備標識,但是并不推薦這么做,原因有以下兩點:
硬件限制:并不是所有的設備都有Wifi和藍牙硬件,硬件不存在自然也就得不到這一信息。
獲取的限制:如果Wifi沒有打開過,是無法獲取其Mac地址的;而藍牙是只有在打開的時候才能獲取到其Mac地址。
不論是采用哪種方式來進行授權,理論上都是可以被破解的。只要破解者發現了軟件授權機制和原理則任何保護機制都將化為烏有。因此,只能夠通過選擇復雜的算法和機制來增加破解者的破解難度,從而在在一定的時間內保證軟件不被盜用。
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點需要花時間研究。
下圖是生成序列號與反查序列號界面截圖(構想)。
圖 10 序列號生成軟件
下圖是序列號生成流程圖(構想)。
第一步:通過5.2(1)方法獲取安裝設備的UUID,如:
9d669361-7f8a-4f97-b08a-488e4a92ee52;該UUID應該存儲在設備的軟件安裝路徑一份,以備對比驗證。
第二步:填寫對應安裝的軟件版本號,如1.0.0.1;
第三步:填寫使用或授權限定使用的期限,如3年。
第四步:點擊生成序列號生成授權序列號(后臺會調用RSA加密算法,對輸入內容進行加密)。
圖 11 序列號生成流程圖
下圖2是序列號驗證邏輯流程圖(構想)。
第一步:輸入獲取的序列號。
第二步:后臺執行RSA解密序列號。
第三步:判定各個屬性值和安裝設備是否一致。
第四步:全部相同確定為有效序列號,可以放行軟件功能權限。
圖 12序列號驗證邏輯流程圖
【1】Linux Mac 地址修改方法
https://zhangge.net/2631.html
【2】UUID唯一資源命名空間的來龍去脈(RFC4122)
https://segmentfault.com/a/1190000000484508
【3】Linux磁盤分區UUID的獲取及其UUID的作用
http://blog.chinaunix.net/uid-26517277-id-3240867.html
【4】Java平臺生成GUID
http://www.cnblogs.com/jdonson/archive/2009/07/22/1528466.html
【5】詳解Linux中獲取全球唯一標示符UUID的方法
http://www.jb51.net/LINUXjishu/433891.html
【6】各種OS生成UUID的方法
http://linfan.info/blog/2012/04/20/uuid/
【7】注冊碼的原理(可參考)
http://blog.csdn.net/jacky_think/article/details/4565241
https://www.zhihu.com/question/20107987
【8】UUID的生成算法
http://blog.csdn.net/ubuntu64fan/article/details/1787891
【9】Windows修改Mac地址方法
http://jingyan.baidu.com/article/4b52d70266bde7fc5c774ba7.html
2016-3-23 pm21:22 思于家中床前
作者:銘毅天下 轉載請標明出處,原文地址:http://blog.csdn.net/laoyang360/article/details/50966707