溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#序列號(hào)的設(shè)計(jì)不重復(fù)的實(shí)現(xiàn)方法是什么

發(fā)布時(shí)間:2021-11-26 16:20:51 來源:億速云 閱讀:565 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“C#序列號(hào)的設(shè)計(jì)不重復(fù)的實(shí)現(xiàn)方法是什么”,在日常操作中,相信很多人在C#序列號(hào)的設(shè)計(jì)不重復(fù)的實(shí)現(xiàn)方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C#序列號(hào)的設(shè)計(jì)不重復(fù)的實(shí)現(xiàn)方法是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

 序列號(hào)的設(shè)計(jì)

    序列號(hào)作為軟件使用授權(quán)方式之一,被廣泛使用在應(yīng)用軟件方面。主要考慮到這幾方面:1.對(duì)知識(shí)產(chǎn)權(quán)的保護(hù),畢竟付出來腦力勞動(dòng)和體力勞動(dòng)。2.商業(yè)競(jìng)爭(zhēng)中增加防守的能力,防止被競(jìng)爭(zhēng)對(duì)手盜取。3.增強(qiáng)合同的執(zhí)行效力,防止另一方由于各種原因破壞合作機(jī)制。

    基于上述方面,從保護(hù)、防守思維模式角度考慮,增加序列號(hào)功能是有必要的。每個(gè)作者或公司設(shè)計(jì)序列號(hào)的方式不一樣,就是因?yàn)椴灰粯?,所以才能達(dá)到我們?cè)黾釉摴δ艿男Ч?/p>

14.1     設(shè)計(jì)原則

  1. 序列號(hào)長(zhǎng)度盡可能短

    主要是從成本角度考慮的。例如用戶現(xiàn)場(chǎng)需要一個(gè)正版軟件的序列號(hào),你把序列號(hào)信息通過什么方式傳遞給用戶呢?假設(shè)我們用對(duì)稱或非對(duì)稱方式生成一個(gè)很長(zhǎng)的序列號(hào),如果口述告訴對(duì)方的話,那么對(duì)方肯定要用紙和筆進(jìn)行記錄,最后輸入到軟件后還不一定正確;如果把序列號(hào)以文件的方式通過網(wǎng)絡(luò)傳遞給對(duì)方,那么需要占用網(wǎng)絡(luò)資源,另外對(duì)方的電腦不一定有網(wǎng)絡(luò)環(huán)境。不管如何,很長(zhǎng)的序列號(hào)在生成和傳遞的過程中可能涉及到的成本包括:材料成本、流量成本、人力成本和時(shí)間成本等。

     如果一個(gè)字符可以表達(dá)序列號(hào)所需要的完整信息,那么是最理想的。但是,這是理想狀態(tài),是不可能實(shí)現(xiàn)的,至少以我現(xiàn)在的能力是無法完成的。所以,要以最佳的長(zhǎng)度表達(dá)出序列號(hào)的全部信息。

  1. 避免出現(xiàn)容易混淆的字符生成一個(gè)序列號(hào)發(fā)給了用戶,這個(gè)序列號(hào)包括:數(shù)字0和字母O,數(shù)字1和字母l。難道讓用戶一遍一遍的試嘛,這樣的用戶體驗(yàn)太差了,雖然嘴上不說出來,至少感覺不太舒服。

14.2     設(shè)計(jì)思想

    設(shè)計(jì)的思想要看序列號(hào)要實(shí)現(xiàn)什么樣的功能和具備什么屬性。從功能角度考慮,包括:1.一個(gè)計(jì)算機(jī)一個(gè)序列號(hào);2.盡管輸入的條件都一樣,每次生成的序列號(hào)都不一樣;3.對(duì)使用的時(shí)限進(jìn)行驗(yàn)證;4.序列號(hào)有注冊(cè)時(shí)限,超過規(guī)定的使用時(shí)間,序列號(hào)作廢,避免短時(shí)間多次注冊(cè)。從屬性角度考慮,包括:同樣的計(jì)算機(jī)、同樣的輸入條件生成的序列號(hào)都不一樣。

   我們把上述因素考慮進(jìn)去,序列號(hào)長(zhǎng)度為25位字符,序列號(hào)生成格式和元素信息如下圖:

 C#序列號(hào)的設(shè)計(jì)不重復(fù)的實(shí)現(xiàn)方法是什么

 X01-X05:為計(jì)算機(jī)的特征碼,5位字符串,獲得機(jī)器某個(gè)部件的ID,這個(gè)部件可能為CPU、網(wǎng)卡、硬盤等信息,把ID進(jìn)行MD5加密后取前5個(gè)字符作為特征碼,來實(shí)現(xiàn)一機(jī)一碼。這種方式,特征碼有可能有相同的情況,但是機(jī)率很小。

 X06-X13:為生成序列號(hào)的日期,8位字符串,格式為:yyyyMMdd。與后邊的使用時(shí)間限制配合使用,來驗(yàn)證軟件的使用期限。

 X14-X15:為注冊(cè)時(shí)間限制,2位數(shù)字字符,從生成序列號(hào)日期算起,超過此注冊(cè)時(shí)間限制,序列號(hào)將無法正常進(jìn)行注冊(cè)操作。

 X16-X20:為使用時(shí)間限制,5位數(shù)字字符,與生成序列號(hào)日期配合使用來驗(yàn)證軟件使用期限。

 X21:為序列號(hào)的偏移量,1位字符,不管在什么場(chǎng)景下,每次生成序列號(hào)的偏移量都不一樣。

X22-X25:為保留數(shù)據(jù)位,暫時(shí)不使用。自定義一個(gè)序列號(hào)字典信息,例如:_Dictionary ="JCB8EF2GH7K6MVP9QR3TXWY4",把容易混淆的字符去掉,這個(gè)可以自定義。序列號(hào)的每個(gè)部分都是通過隨機(jī)生成的偏移量(X21),對(duì)字典進(jìn)行位移,根據(jù)輸入的數(shù)字信息對(duì)應(yīng)字典的下標(biāo)提取相應(yīng)的字符作為序列號(hào)的一個(gè)字符。

   生成序列號(hào)的大概過程:

  1. 在字典信息的長(zhǎng)度范圍內(nèi)隨機(jī)生成一個(gè)偏移量數(shù)字。

  2. 根據(jù)偏移量數(shù)字對(duì)字典進(jìn)行左或右的循環(huán)移動(dòng)。

  3. 根據(jù)輸入的數(shù)字信息,例如:2015中的2,作為下標(biāo),從字典信息中提取出相應(yīng)的字符。

反向解析大概過程類似,只需要根據(jù)X21字符,與字典的字符進(jìn)行匹配,對(duì)應(yīng)的下標(biāo)作為偏移量,就可以反向解析出各項(xiàng)信息。

14.3     代碼實(shí)現(xiàn)

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.注冊(cè)信息類:

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.        序列號(hào)管理類

+ View Code

14.4     代碼混淆

   從安全角度來講,.NET程序如果不加混淆的話,很容易被反編譯出源代碼的。從專業(yè)角度來講,即使增加了序列號(hào)功能,也無濟(jì)于事,專業(yè)的人員分分鐘可以破解掉,盡管這樣干的人很少,但是存在這種可能性。如果一個(gè)軟件人員想了解一個(gè)很好的軟件,第一反映可能就是反編譯。

   對(duì)于公司或商業(yè)使用的軟件來講,增加混淆還是有必要的,盡管現(xiàn)在開源很流行。

14.5     代碼破解

    不管.NET程序如何進(jìn)行混淆,理論上都是可以破解的,理論的東西就不贅述了。通常接觸過的破解方式有兩種:注冊(cè)機(jī)方式和暴力方式。

    注冊(cè)機(jī)的方式,需要通過軟件的驗(yàn)證序列號(hào)的過程和機(jī)制反向推算出序列號(hào)的生成算法,根據(jù)反推的算法開發(fā)一個(gè)小軟件,用于生成脫離作者授權(quán)生成序列號(hào)。這種方式不會(huì)破壞程序本身的代碼,相對(duì)溫和。暴力的方式,就是找到序列號(hào)驗(yàn)證部分的代碼,通過刪除或繞過驗(yàn)證代碼等方式不讓代碼有效執(zhí)行。這種方式會(huì)對(duì)程序本身的代碼進(jìn)行改動(dòng),所以也存在一些風(fēng)險(xiǎn)。

14.6     小結(jié)

     實(shí)現(xiàn)序列號(hào)有多種方式,上述方式不一定最好,但是希望對(duì)開發(fā)者有一定幫助。

最終實(shí)現(xiàn)效果圖如下:

C#序列號(hào)的設(shè)計(jì)不重復(fù)的實(shí)現(xiàn)方法是什么

到此,關(guān)于“C#序列號(hào)的設(shè)計(jì)不重復(fù)的實(shí)現(xiàn)方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI