周 敏 徐 剛
( 江蘇省靖江中等專業(yè)學(xué)校,江蘇 靖江214500)
筆者在與本地企業(yè)合作研發(fā)安防產(chǎn)品時(shí), 對(duì)監(jiān)控場(chǎng)所的被監(jiān)控設(shè)備的操作是一件涉及到安全的行為,只有經(jīng)過授權(quán)的操作員才能執(zhí)行操作并日志記錄;另外,第三方平臺(tái)有時(shí)需要與安防監(jiān)控系統(tǒng)進(jìn)行整合,經(jīng)過授權(quán)的第三方可以在授權(quán)時(shí)間內(nèi)通過調(diào)用開發(fā)包來(lái)直接監(jiān)控被監(jiān)控設(shè)備。
基于機(jī)器特征碼和時(shí)間戳的軟件注冊(cè)機(jī)制可以實(shí)現(xiàn)上述功能需求, 控制操作員和第三方在授權(quán)范圍內(nèi)使用相應(yīng)功能。 基于機(jī)器特征碼的注冊(cè)碼可以控制軟件只能在指定計(jì)算機(jī)上運(yùn)行,不僅控制了操作權(quán)限,還有效避免了軟件的肆意拷貝;基于時(shí)間戳的注冊(cè)碼不僅可以控制軟件運(yùn)行的有效期,還能保障合同條款的有效履行。
根據(jù)實(shí)際需求, 軟件安裝完成后需要注冊(cè)才能獲得核心監(jiān)控功能, 用戶將軟件注冊(cè)界面中的機(jī)器特征碼提供給筆者,筆者基于機(jī)器特征碼和時(shí)間戳生成注冊(cè)碼文件返回給用戶,用戶導(dǎo)入注冊(cè)碼文件即可正常進(jìn)行設(shè)備的監(jiān)控操作。
機(jī)器特征碼是基于所安裝軟件的計(jì)算機(jī)的軟、 硬件信息經(jīng)過復(fù)雜加密運(yùn)算得到的32 位長(zhǎng)度的一串代碼,生成機(jī)器特征碼的過程中要考慮以下問題:
2.2.1 軟、硬件信息的來(lái)源
通常情況下,計(jì)算機(jī)中CPU、硬盤、主板和內(nèi)存條都有唯一的序列號(hào),網(wǎng)卡也有唯一的MAC 地址,這些硬件基本信息可以作為機(jī)器特征碼的基礎(chǔ)數(shù)據(jù)來(lái)源。
筆者在考慮軟件信息來(lái)源時(shí)只考慮了提取注冊(cè)用戶的單位名稱。
2.2.2 加密算法的設(shè)計(jì)
為了使機(jī)器特征碼具有較好的安全性, 加密過程采用了8輪Base64 和32 位MD5 加密,初始密文( 即明文)由軟、硬件信息和一些特殊字符按特定的格式組合而成,每輪在上輪密文基礎(chǔ)上進(jìn)行一次Base64 加密和不少于1 次的MD5 加密,MD5 加密次數(shù)由Base64 加密結(jié)果的ASCII 碼之和對(duì)16 的余數(shù)決定。經(jīng)過8 輪加密后的密文有32 位長(zhǎng), 然后根據(jù)最后一位密文字符,從16 種換位算法中選擇一種算法重組機(jī)器特征碼。 流程圖如圖1 所示。
注冊(cè)碼由機(jī)器特征碼和時(shí)間戳經(jīng)過RSA 加密生成,其中時(shí)間戳是軟件授權(quán)使用的截止時(shí)間。
RSA 加密算法是一種在公開密鑰加密和電子商業(yè)中被廣泛使用的非對(duì)稱加密算法,RSA 加密體制中包含一對(duì)秘鑰, 即公鑰和私鑰,加密算法可以使用其中一個(gè)對(duì)明文進(jìn)行加密,使用另一個(gè)對(duì)密文進(jìn)行解密。
筆者生成了50 對(duì)秘鑰形成秘鑰池, 根據(jù)機(jī)器特征碼的ASCII 碼之和對(duì)50 的余數(shù)選擇具體使用哪一對(duì)秘鑰進(jìn)行加、解密運(yùn)算。
筆者采用C# 語(yǔ)言在Visual Studio 2010 環(huán)境中進(jìn)行軟件的研發(fā)。
軟件的注冊(cè)界面如圖2 所示。
圖2
32 位機(jī)器碼按四位一組的形成顯示在注冊(cè)界面中, 用戶點(diǎn)擊“ 復(fù)制機(jī)器碼”按鈕將機(jī)器碼貼到剪貼板即可發(fā)送給筆者;點(diǎn)擊“ 導(dǎo)入注冊(cè)文件”可以將包含注冊(cè)碼的文本文件保存到軟件的安裝文件夾中。
3.1.1 機(jī)器碼的提取
C# 語(yǔ)言提供了ManagementClass 類來(lái)獲取本機(jī)的一些基本信息,這個(gè)類是一個(gè)通用信息模型( CIM)管理類,該管理類是WMI 類, 其中Win32_Process 可以獲取CPU 的基本信息,Win32_NetworkAdapterConfiguration 可以獲取網(wǎng)卡的基本信息,WIN32_BaseBoard 可以獲取主板的基本信息, Win32_DiskDrive可以獲取硬盤的基本信息,Win32_PhysicalMemory 可以獲取內(nèi)存的基本信息。 以獲取CPU 的序列號(hào)為例,代碼如下:
3.1.2 注冊(cè)碼的驗(yàn)證
用戶在導(dǎo)入注冊(cè)碼文件后,軟件會(huì)重新驗(yàn)證注冊(cè)碼信息。首先對(duì)注冊(cè)碼進(jìn)行Base64 解密, 然后根據(jù)機(jī)器特征碼選擇RSA公鑰池中正確的解密秘鑰,對(duì)注冊(cè)碼進(jìn)行RSA 解密,解密后的注冊(cè)碼如果不符合指定格式則提示“ 注冊(cè)文件非法”,接著驗(yàn)證機(jī)器特征碼和時(shí)間戳,均通過驗(yàn)證后可以使用軟件或開發(fā)包的全部功能,否則切換成“ 試用版”禁用一些核心功能。 代碼略。
注冊(cè)碼生成器的界面如圖3 所示。
圖3
選擇用戶軟件的版本號(hào),粘貼機(jī)器特征碼,確定授權(quán)時(shí)間,點(diǎn)擊“ 生成導(dǎo)出”即可生成注冊(cè)碼文件。 生成導(dǎo)出過程主要由初始RSA 秘鑰池、選擇秘鑰、生成注冊(cè)碼和加密保存四步完成。
3.2.1 秘鑰池的生成
秘 鑰 池 由 100 對(duì) 秘 鑰 組 成 ,C# 中 提 供 了RSACryptoServiceProvider 類可以很方便的產(chǎn)生RSA 密鑰對(duì),并進(jìn)行RSA 加、 解密運(yùn)算, 涉及到的方法主要有ToXmlString、FromXmlString、Encrypt 和Decrypt。 公鑰和私鑰分別保存在不同的文件中, 其中公鑰池文件隨軟件發(fā)布給用戶。 生成秘鑰池的代碼如下所示:
3.2.2 注冊(cè)碼文件的生成
從私鑰池文件中讀入秘鑰, 根據(jù)機(jī)器特征碼ASCII 之和對(duì)50 的余數(shù)選擇加密秘鑰,按指定格式拼接用戶機(jī)器特征碼和時(shí)間戳,然后調(diào)用Encrypt 方法對(duì)注冊(cè)碼進(jìn)行RSA 加密,最后將密文再次Base64 加密轉(zhuǎn)換成可顯示的ASCII 字符保存。 代碼略。
基于上述設(shè)計(jì)思路, 筆者在Windows 8.1 和Visual Studio 2010 開發(fā)環(huán)境中,實(shí)現(xiàn)了基于機(jī)器特征碼和時(shí)間戳的軟件注冊(cè)機(jī)制。 因?yàn)槊颗_(tái)計(jì)算機(jī)的軟、硬件信息組合是唯一的,所以根據(jù)加密算法可知機(jī)器特征碼、注冊(cè)碼也是唯一的,這樣既保護(hù)了軟件開發(fā)者的知識(shí)產(chǎn)權(quán),也保護(hù)了用戶的利益,同時(shí)加、解密過程中引用了多種算法,提高了機(jī)器特征碼和注冊(cè)碼自身的安全性,實(shí)際應(yīng)用中達(dá)到了良好的效果。