本系列文章主要介紹我近期設計的乙個軟體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產品專案裡的部分設計為參考,通過幾篇文章來和大家分享業...