周 敏 徐 剛
( 江蘇省靖江中等專業(yè)學校,江蘇 靖江214500)
筆者在與本地企業(yè)合作研發(fā)安防產(chǎn)品時, 對監(jiān)控場所的被監(jiān)控設(shè)備的操作是一件涉及到安全的行為,只有經(jīng)過授權(quán)的操作員才能執(zhí)行操作并日志記錄;另外,第三方平臺有時需要與安防監(jiān)控系統(tǒng)進行整合,經(jīng)過授權(quán)的第三方可以在授權(quán)時間內(nèi)通過調(diào)用開發(fā)包來直接監(jiān)控被監(jiān)控設(shè)備。
基于機器特征碼和時間戳的軟件注冊機制可以實現(xiàn)上述功能需求, 控制操作員和第三方在授權(quán)范圍內(nèi)使用相應(yīng)功能。 基于機器特征碼的注冊碼可以控制軟件只能在指定計算機上運行,不僅控制了操作權(quán)限,還有效避免了軟件的肆意拷貝;基于時間戳的注冊碼不僅可以控制軟件運行的有效期,還能保障合同條款的有效履行。
根據(jù)實際需求, 軟件安裝完成后需要注冊才能獲得核心監(jiān)控功能, 用戶將軟件注冊界面中的機器特征碼提供給筆者,筆者基于機器特征碼和時間戳生成注冊碼文件返回給用戶,用戶導入注冊碼文件即可正常進行設(shè)備的監(jiān)控操作。
機器特征碼是基于所安裝軟件的計算機的軟、 硬件信息經(jīng)過復(fù)雜加密運算得到的32 位長度的一串代碼,生成機器特征碼的過程中要考慮以下問題:
2.2.1 軟、硬件信息的來源
通常情況下,計算機中CPU、硬盤、主板和內(nèi)存條都有唯一的序列號,網(wǎng)卡也有唯一的MAC 地址,這些硬件基本信息可以作為機器特征碼的基礎(chǔ)數(shù)據(jù)來源。
筆者在考慮軟件信息來源時只考慮了提取注冊用戶的單位名稱。
2.2.2 加密算法的設(shè)計
為了使機器特征碼具有較好的安全性, 加密過程采用了8輪Base64 和32 位MD5 加密,初始密文( 即明文)由軟、硬件信息和一些特殊字符按特定的格式組合而成,每輪在上輪密文基礎(chǔ)上進行一次Base64 加密和不少于1 次的MD5 加密,MD5 加密次數(shù)由Base64 加密結(jié)果的ASCII 碼之和對16 的余數(shù)決定。經(jīng)過8 輪加密后的密文有32 位長, 然后根據(jù)最后一位密文字符,從16 種換位算法中選擇一種算法重組機器特征碼。 流程圖如圖1 所示。
注冊碼由機器特征碼和時間戳經(jīng)過RSA 加密生成,其中時間戳是軟件授權(quán)使用的截止時間。
RSA 加密算法是一種在公開密鑰加密和電子商業(yè)中被廣泛使用的非對稱加密算法,RSA 加密體制中包含一對秘鑰, 即公鑰和私鑰,加密算法可以使用其中一個對明文進行加密,使用另一個對密文進行解密。
筆者生成了50 對秘鑰形成秘鑰池, 根據(jù)機器特征碼的ASCII 碼之和對50 的余數(shù)選擇具體使用哪一對秘鑰進行加、解密運算。
筆者采用C# 語言在Visual Studio 2010 環(huán)境中進行軟件的研發(fā)。
軟件的注冊界面如圖2 所示。

圖2
32 位機器碼按四位一組的形成顯示在注冊界面中, 用戶點擊“ 復(fù)制機器碼”按鈕將機器碼貼到剪貼板即可發(fā)送給筆者;點擊“ 導入注冊文件”可以將包含注冊碼的文本文件保存到軟件的安裝文件夾中。
3.1.1 機器碼的提取
C# 語言提供了ManagementClass 類來獲取本機的一些基本信息,這個類是一個通用信息模型( CIM)管理類,該管理類是WMI 類, 其中Win32_Process 可以獲取CPU 的基本信息,Win32_NetworkAdapterConfiguration 可以獲取網(wǎng)卡的基本信息,WIN32_BaseBoard 可以獲取主板的基本信息, Win32_DiskDrive可以獲取硬盤的基本信息,Win32_PhysicalMemory 可以獲取內(nèi)存的基本信息。 以獲取CPU 的序列號為例,代碼如下:

3.1.2 注冊碼的驗證
用戶在導入注冊碼文件后,軟件會重新驗證注冊碼信息。首先對注冊碼進行Base64 解密, 然后根據(jù)機器特征碼選擇RSA公鑰池中正確的解密秘鑰,對注冊碼進行RSA 解密,解密后的注冊碼如果不符合指定格式則提示“ 注冊文件非法”,接著驗證機器特征碼和時間戳,均通過驗證后可以使用軟件或開發(fā)包的全部功能,否則切換成“ 試用版”禁用一些核心功能。 代碼略。
注冊碼生成器的界面如圖3 所示。

圖3
選擇用戶軟件的版本號,粘貼機器特征碼,確定授權(quán)時間,點擊“ 生成導出”即可生成注冊碼文件。 生成導出過程主要由初始RSA 秘鑰池、選擇秘鑰、生成注冊碼和加密保存四步完成。
3.2.1 秘鑰池的生成
秘 鑰 池 由 100 對 秘 鑰 組 成 ,C# 中 提 供 了RSACryptoServiceProvider 類可以很方便的產(chǎn)生RSA 密鑰對,并進行RSA 加、 解密運算, 涉及到的方法主要有ToXmlString、FromXmlString、Encrypt 和Decrypt。 公鑰和私鑰分別保存在不同的文件中, 其中公鑰池文件隨軟件發(fā)布給用戶。 生成秘鑰池的代碼如下所示:

3.2.2 注冊碼文件的生成
從私鑰池文件中讀入秘鑰, 根據(jù)機器特征碼ASCII 之和對50 的余數(shù)選擇加密秘鑰,按指定格式拼接用戶機器特征碼和時間戳,然后調(diào)用Encrypt 方法對注冊碼進行RSA 加密,最后將密文再次Base64 加密轉(zhuǎn)換成可顯示的ASCII 字符保存。 代碼略。
基于上述設(shè)計思路, 筆者在Windows 8.1 和Visual Studio 2010 開發(fā)環(huán)境中,實現(xiàn)了基于機器特征碼和時間戳的軟件注冊機制。 因為每臺計算機的軟、硬件信息組合是唯一的,所以根據(jù)加密算法可知機器特征碼、注冊碼也是唯一的,這樣既保護了軟件開發(fā)者的知識產(chǎn)權(quán),也保護了用戶的利益,同時加、解密過程中引用了多種算法,提高了機器特征碼和注冊碼自身的安全性,實際應(yīng)用中達到了良好的效果。