License系統設計(一)

2021-09-24 15:29:32 字數 2888 閱讀 3212

本系列文章主要介紹我近期設計的乙個軟體license系統。

一、軟體需求

假設m公司要發布一款軟硬體一體的產品,名為「officedevice」。這個officedevice的上層是乙個pc,下層帶一些嵌入式裝置,而pc上執行乙個叫「office kits」的軟體,這個軟體包含三個功能模組:word、ppt和excel。

現在要設計乙個license系統,需滿足以下兩點需求:

1,機器繫結

office kits在啟動後,需要驗證license,這個license的某個資訊欄位要與機器的序列號匹配,如果不匹配,則判license無效。機器的序列號可以是主機板編號,當然,officedevice的序列號,來自與它的某個嵌入式裝置。

2,模組許可權

m公司需要將word、ppt和excel三個模組分開賣,license的某個資訊欄位要包含模組許可權的資訊,office kits在啟動後,需要驗證這個資訊,驗證後只啟用符合許可權的模組。

3,試用期

m公司會發布試用license,試用期一到,license失效。office kits的word、ppt和excel三個模組不能工作。

二、產品設計

從上面的軟體需求可知,這個license系統可以分成兩個部分,乙個是license檔案生成軟體,乙個是解密模組。

1,license generator

license generator提供一gui,根據m公司的配置,生成乙個license檔案。介面設計如下:

如上圖,左邊是配置項,右邊第一組控制項,主要是預覽待加密的字串,第二組控制項執行加密過程,並生成加密檔案,檔名是「序列號+字尾」,第三組控制項,主要是對比,看解密後的字串是否與明文一致。

注:關於序列號,有很多產品直接選用主機的硬碟序列號。這裡我通過google搜到了乙個不錯的獲取硬碟序列號的原始碼,分享如下:

這個需要在管理員模式下才能讀硬碟序列號。

這個在非管理員模式下也可以讀硬碟序列號。

2,解密模組

解密模組我們以匯出庫的形式,嵌入到office kits軟體中,office kits軟體啟動後,會加license檔案讀入,並解密成字串,然後校驗相應的資訊字段。最後,根據校驗結果,關閉或啟用相應的功能。

解密模組最好以「.lib」靜態庫的方式嵌入,在office kits軟體目錄下,並不能直接看到解密模組檔案,這樣更加難以破解。不過,我後面設計的還是採用「.dll」的方式嵌入的,主要是為了復用。但是,我還是採用了一些技巧,防止api攔截的破解方式。

三、加解密模組

後面開始從**實現的角度進行講解。首先需要介紹的就是加解密功能,採用的是crypto++開源加密演算法庫,並將它分裝成乙個dll。

封裝過程:

1,vs新建win32 dll工程:aes_dll.sln

2,新增匯出函式和介面類

#ifndef aes_dll_h

#define aes_dll_h

#ifdef aes_import

#define aes_api extern "c" __declspec(dllexport)

#else

#define aes_api extern "c" __declspec(dllimport)

#endif

#include

using std::string;

class iencryptor

;aes_api iencryptor* createencryptor();

aes_api void releaseencryptor(iencryptor* pencryptor);

typedef iencryptor* (*pfncreateencryptor)();

typedef void (*pfnreleaseencryptor)(iencryptor*);

#endif    // aes_dll_h

2,匯出函式的實現

#include "stdafx.h"

#include "easyaes.h"

#include "encryptor.h"

#define aes_import

iencryptor* createencryptor()

void releaseencryptor(iencryptor* pencryptor)

}3,實現類

class easyaes : public iencryptor

// string is not empty, the encrypt the file

cbc_mode::encryption aesencryptor(key, key_length, iv);

stringsource(plaintext, true,

new streamtransformationfilter(aesencryptor,

new filesink(outfilename)));

return true;

}bool easyaes::decryptfile2string(const char * decfilename, char * recovertext)

// exist , then decrypt the file

string buffer;

cbc_mode::decryption aesdecryptor(key, key_length, iv);

filesource(decfilename, true,

new streamtransformationfilter(aesdecryptor,

new stringsink(buffer)));

memcpy(recovertext, buffer.c_str(), buffer.size());

return true;

}具體實現部分,都是crypto++庫的內容,有有興趣的直接研究它就行。

軟體License認證設計思路

licensetype 許可證型別,目前分為 空,試用,其他 三類。companyname 公司名稱,即使用客戶的資訊,可以是除換行外的任意字串。machinecode 機器特徵碼,使用機器的mac位址作為唯一碼。mc cpu 處理器名稱 mc mac mac位址 installdate 安裝日期,...

業務系統設計之一 系統選單設計

很久沒寫文章了,前幾天有幾個朋友問了我很多關於業務系統 erp,drp,crm等 設計裡很多概念性東西,花了很長時間給他解釋,最後他門還是知其然不知其所以然,這對於剛跨出學校大門的朋友來說,理解起確實有點枯燥。這裡我以以前參與的用友erp,drp產品專案裡的部分設計為參考,通過幾篇文章來和大家分享業...

業務系統設計之一 系統選單設計

很久沒寫文章了,前幾天有幾個朋友問了我很多關於業務系統 erp,drp,crm等 設計裡很多概念性東西,花了很長時間給他解釋,最後他門還是知其然不知其所以然,這對於剛跨出學校大門的朋友來說,理解起確實有點枯燥。這裡我以以前參與的用友erp,drp產品專案裡的部分設計為參考,通過幾篇文章來和大家分享業...