您好,登錄后才能下訂單哦!
這篇文章主要介紹“C#序列號的設計不重復的實現方法是什么”,在日常操作中,相信很多人在C#序列號的設計不重復的實現方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#序列號的設計不重復的實現方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
序列號的設計
序列號作為軟件使用授權方式之一,被廣泛使用在應用軟件方面。主要考慮到這幾方面:1.對知識產權的保護,畢竟付出來腦力勞動和體力勞動。2.商業競爭中增加防守的能力,防止被競爭對手盜取。3.增強合同的執行效力,防止另一方由于各種原因破壞合作機制。
基于上述方面,從保護、防守思維模式角度考慮,增加序列號功能是有必要的。每個作者或公司設計序列號的方式不一樣,就是因為不一樣,所以才能達到我們增加該功能的效果。
序列號長度盡可能短
主要是從成本角度考慮的。例如用戶現場需要一個正版軟件的序列號,你把序列號信息通過什么方式傳遞給用戶呢?假設我們用對稱或非對稱方式生成一個很長的序列號,如果口述告訴對方的話,那么對方肯定要用紙和筆進行記錄,最后輸入到軟件后還不一定正確;如果把序列號以文件的方式通過網絡傳遞給對方,那么需要占用網絡資源,另外對方的電腦不一定有網絡環境。不管如何,很長的序列號在生成和傳遞的過程中可能涉及到的成本包括:材料成本、流量成本、人力成本和時間成本等。
如果一個字符可以表達序列號所需要的完整信息,那么是最理想的。但是,這是理想狀態,是不可能實現的,至少以我現在的能力是無法完成的。所以,要以最佳的長度表達出序列號的全部信息。
避免出現容易混淆的字符生成一個序列號發給了用戶,這個序列號包括:數字0和字母O,數字1和字母l。難道讓用戶一遍一遍的試嘛,這樣的用戶體驗太差了,雖然嘴上不說出來,至少感覺不太舒服。
設計的思想要看序列號要實現什么樣的功能和具備什么屬性。從功能角度考慮,包括:1.一個計算機一個序列號;2.盡管輸入的條件都一樣,每次生成的序列號都不一樣;3.對使用的時限進行驗證;4.序列號有注冊時限,超過規定的使用時間,序列號作廢,避免短時間多次注冊。從屬性角度考慮,包括:同樣的計算機、同樣的輸入條件生成的序列號都不一樣。
我們把上述因素考慮進去,序列號長度為25位字符,序列號生成格式和元素信息如下圖:
X01-X05:為計算機的特征碼,5位字符串,獲得機器某個部件的ID,這個部件可能為CPU、網卡、硬盤等信息,把ID進行MD5加密后取前5個字符作為特征碼,來實現一機一碼。這種方式,特征碼有可能有相同的情況,但是機率很小。
X06-X13:為生成序列號的日期,8位字符串,格式為:yyyyMMdd。與后邊的使用時間限制配合使用,來驗證軟件的使用期限。
X14-X15:為注冊時間限制,2位數字字符,從生成序列號日期算起,超過此注冊時間限制,序列號將無法正常進行注冊操作。
X16-X20:為使用時間限制,5位數字字符,與生成序列號日期配合使用來驗證軟件使用期限。
X21:為序列號的偏移量,1位字符,不管在什么場景下,每次生成序列號的偏移量都不一樣。
X22-X25:為保留數據位,暫時不使用。自定義一個序列號字典信息,例如:_Dictionary ="JCB8EF2GH7K6MVP9QR3TXWY4",把容易混淆的字符去掉,這個可以自定義。序列號的每個部分都是通過隨機生成的偏移量(X21),對字典進行位移,根據輸入的數字信息對應字典的下標提取相應的字符作為序列號的一個字符。
生成序列號的大概過程:
在字典信息的長度范圍內隨機生成一個偏移量數字。
根據偏移量數字對字典進行左或右的循環移動。
根據輸入的數字信息,例如:2015中的2,作為下標,從字典信息中提取出相應的字符。
反向解析大概過程類似,只需要根據X21字符,與字典的字符進行匹配,對應的下標作為偏移量,就可以反向解析出各項信息。
1.MD5操作類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public
class
Safety
{
public
static
string
MD5(
string
str)
{
string
strResult =
""
;
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte
[] bData = md5.ComputeHash(Encoding.Unicode.GetBytes(str));
for
(
int
i = 0; i < bData.Length; i++)
{
strResult = strResult + bData[i].ToString(
"X"
);
}
return
strResult;
}
}
|
2.注冊信息類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public
class
RegInfo
{
public
RegInfo()
{
KeySn =
""
;
Date=DateTime.MinValue;
RegLimitDays = 0;
UseLimitDays = 0;
Offset = 0;
}
public
string
KeySn {
get
;
set
; }
public
DateTime Date {
get
;
set
; }
public
int
RegLimitDays {
get
;
set
; }
public
int
UseLimitDays {
get
;
set
; }
public
int
Offset {
get
;
set
; }
}
|
3.偏移操作類型:
1 2 3 4 5 | internal
enum
OffsetType
{
Left,
Right
}
|
4. 序列號管理類
+ View Code
從安全角度來講,.NET程序如果不加混淆的話,很容易被反編譯出源代碼的。從專業角度來講,即使增加了序列號功能,也無濟于事,專業的人員分分鐘可以破解掉,盡管這樣干的人很少,但是存在這種可能性。如果一個軟件人員想了解一個很好的軟件,第一反映可能就是反編譯。
對于公司或商業使用的軟件來講,增加混淆還是有必要的,盡管現在開源很流行。
不管.NET程序如何進行混淆,理論上都是可以破解的,理論的東西就不贅述了。通常接觸過的破解方式有兩種:注冊機方式和暴力方式。
注冊機的方式,需要通過軟件的驗證序列號的過程和機制反向推算出序列號的生成算法,根據反推的算法開發一個小軟件,用于生成脫離作者授權生成序列號。這種方式不會破壞程序本身的代碼,相對溫和。暴力的方式,就是找到序列號驗證部分的代碼,通過刪除或繞過驗證代碼等方式不讓代碼有效執行。這種方式會對程序本身的代碼進行改動,所以也存在一些風險。
實現序列號有多種方式,上述方式不一定最好,但是希望對開發者有一定幫助。
最終實現效果圖如下:
到此,關于“C#序列號的設計不重復的實現方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。