导言
行业应用软件加密分为软加密和硬加密。
硬加密优点是安全,但是具有一定硬件成本,并且需要把硬件夹馍狗送到用户手中,硬件狗还面临丢失的问题。软加密的特点和硬加密正好相反。
本文主要把自身产品的软加密思路做个梳理。
逻辑整理
核心思路有几点:
1、确定好要加密的功能模块,既可以是某个具体算法,也可以是一个应用软件或者模块,还可以是整个完整系统。
2、确定好加密源,例如本产品选择加密硬盘序列号、CPU硬件标识以及mac地址.可以根据需要选用单一或者个别硬件组合。
3、确定好加密策略,以本产图像处理领域为例,本文选择图像尺寸、并行处理图像张数、授权使用时间作为加密策略。为了组合上述加密策略,考虑了不同类型用户,例如完整试用版、公开试用版、教育版和VIP用户。
4、最后是加密方法实现。主要思路就是可以进行对称加密。本文选择b64作为加密算法。
代码实现
功能模块划分,本产品当前版本把所有加密内容没有按类别划分,直接统一放在了一个结构体,优点是简单高效,缺点是如果加密内容庞大,会有上限。
enum AuthContent : int64_t {
None = 0x0000000000000000,//>没有任何授权
Algo_WimMatch = 0x0000000000000001,//>卫星影像匹配模块
Algo_WimBundler = 0x0000000000000002,//>卫星影像平差模块
Algo_WimOtrho = 0x0000000000000004,//>卫星影像正射校正模块
Algo_WimFusion = 0x0000000000000008,//>影像融合算法模块
Algo_WimMosiac = 0x0000000000000010,//>影像镶嵌模块
Algo_WimCrop = 0x0000000000000020,//>影像裁切模块
Algo_WimDivision = 0x0000000000000040,//>影像分幅模块
Algo_WimColor = 0x0000000000000080,//>影像色彩处理模块
Algo_WimTile = 0x0000000000000100,//>保留
Algo_Keep2 = 0x0000000000000200,//>保留
Algo_Keep3 = 0x0000000000000400,//>保留
Algo_Keep4 = 0x0000000000000800,//>保留
Algo_Keep5 = 0x0000000000001000,//>保留
Algo_Keep6 = 0x0000000000002000,//>保留
Algo_Keep7 = 0x0000000000004000,//>保留
Algo_Keep8 = 0x0000000000008000,//>保留
Algo_Keep9 = 0x0000000000010000,//>保留
Algo_Keep10 = 0x0000000000020000,//>保留
Algo_Keep11 = 0x0000000000040000,//>保留
Algo_Keep12 = 0x0000000000080000,//>保留
Algo_Keep13 = 0x0000000000100000,//>保留
Algo_Keep14 = 0x0000000000200000,//>保留
Algo_Keep15 = 0x0000000000400000,//>保留
Algo_Keep16 = 0x0000000000800000,//>保留
Algo_Keep17 = 0x0000000001000000,//>保留
Algo_Keep18 = 0x0000000002000000,//>保留
Algo_Keep19 = 0x0000000004000000,//>保留
Algo_Keep20 = 0x0000000008000000,//>保留
Algo_Keep21 = 0x0000000010000000,//>保留
Algo_Keep22 = 0x0000000020000000,//>保留
Algo_Keep23 = 0x0000000040000000,//>保留
Algo_Keep24 = 0x0000000080000000,//>保留
//App
App_WimBrowser = 0x0000000100000000,//>浏览软件,含Geobrowser
App_WimMOS = 0x0000000200000000,//>镶嵌软件,含MosiacQt
App_WimQSan = 0x0000000400000000,//>像点量测软件
App_WimAnalysis = 0x0000000800000000,//>智能解译软件
App_WimShpEditor = 0x0000001000000000,//>矢量编辑软件
App_WimMatcher = 0x0000002000000000,//>配准软件
App_WimUAV = 0x0000004000000000,//>无人机处理软件
App_WimUAV_AUTO = 0x0000008000000000,//>无人机处理软件_精简版
App_WimToolkit = 0x0000010000000000,//>工具集软件
App_Keep5 = 0x0000020000000000,//>保留
App_Keep6 = 0x0000040000000000,//>保留
App_Keep7 = 0x0000080000000000,//>保留
App_Keep8 = 0x0000100000000000,//>保留
App_Keep9 = 0x0000200000000000,//>保留
App_Keep10 = 0x0000400000000000,//>保留
App_Keep11 = 0x0000800000000000,//>保留
App_Keep12 = 0x0001000000000000,//>保留
App_Keep13 = 0x0002000000000000,//>保留
App_Keep14 = 0x0004000000000000,//>保留
App_Keep15 = 0x0008000000000000,//>保留
//Scp
Station_Platform = 0x0010000000000000,//>Station整体
Station_Toolbox = 0x0020000000000000,//>Station工具箱
Station_Workflow = 0x0040000000000000,//>Station工作流
Station_Keep1 = 0x0080000000000000,//>保留
Station_Keep2 = 0x0100000000000000,//>保留
WIMSCP_Platform = 0x0200000000000000,//>并行计算平台V1.0整体
WIMSCP_Toolbox = 0x0400000000000000,//>并行计算平台V1.0工具箱
WIMSCP_Workflow = 0x0800000000000000,//>并行计算平台V1.0工作流
WIMSCP_Platform = 0x1000000000000000,//>并行计算平台WebV1.0整体
WIMSCP_Toolbox = 0x2000000000000000,//>并行计算平台WebV1.0工具箱
WIMSCP_Workflow = 0x4000000000000000//>并行计算平台WebV1.0工作流
};
加密策略举例
#define WIM_RESTRICT_PUBLIC_IMG_SIZE 8000 //>限制【公开试用版用户】图像尺寸
#define WIM_RESTRICT_PUBLIC_IMG_COUNT 5 //>限制【公开试用版用户】图像张数
#define WIM_RESTRICT_PUBLIC_TIME 0 //>限制【公开试用版用户】使用天数(0代表不限制)
#define WIM_RESTRICT_PUBLICPRO_IMG_SIZE 0 //>限制【完整试用版用户】图像尺寸
#define WIM_RESTRICT_PUBLICPRO_IMG_COUNT 0 //>限制【完整试用版用户】图像张数
#define WIM_RESTRICT_PUBLICPRO_TIME 90//>限制【完整试用版用户】使用天数(单位:天)
#define WIM_RESTRICT_EDUCATION_IMG_SIZE 10000//>限制【教育版用户】图像尺寸
#define WIM_RESTRICT_EDUCATION_IMG_COUNT 10 //>限制【教育版用户】图像张数
#define WIM_RESTRICT_EDUCATION_TIME 365 //>限制【教育版用户】使用默认天数(单位:天)
#define WIM_RESTRICT_VIP_IMG_SIZE 0 //>【VIP用户】像尺寸
#define WIM_RESTRICT_VIP_IMG_COUNT 0 //>【VIP用户】像张数
#define WIM_RESTRICT_VIP_TIME 365 //>【VIP用户】用天数
#define WIM_LICENSE_VERSION "1.3.0" //每次版本更新需要修改这里。
主要实现
/**
* @brief 用户许可申请信息 结构体。用户提交申请许可信息,从用户那里获取到的信息。
*/
class LIB_WIMLICENSE UserMachineInfo
{
public:
UserMachineInfo();
public:
std::string mac;//机器绑定的mac,
std::string host_name;//机器用户名
std::string ip4_addr;//IP地址
std::string os_name;//操作系统名称
std::string os_release;//操作系统发行版名称
uint16_t cpuid;//CPU特征ID
uint16_t diskid;//主硬盘特征ID
};
/**
* @brief 许可信息结构体。也就是许可文件的组成内容。
* 不同授权用户类型对应不同的授权限制类型。
*/
class LIB_WIMLICENSE LicenseInfo
{
public:
LicenseInfo();
public:
std::string uuid; //>根据用户主机名,mac地址、CPUID、硬盘ID产生的机器UUID。如果不绑定硬件,该值为WIM_DEFAULT_UUID
std::string user_name; //>许可证的用户名字,这个仅用做标记。
std::string start_date; //>用户授权许可时间,精确到日
std::string end_date; //>用户授权终止时间,精确到日
std::string last_use_time;//>最后一次使用时间,精确到秒
int64_t lock_content; //>具体授权内容
AuthUserType user_type; //>许可类型
std::string version; //>加密算法版本号
};
加密方法实现设计
/**
* @brief CustomizeBase64编码/解码类。
*
* CustomizeBase64 类提供了将二进制流按照Base64规范编码/解码的功能。
*/
struct LIB_WIMLICENSE CustomizeBase64
{
static void Encode(const std::string& str, std::string& b64_str);
static void Encode(const char* str, int len, std::string& b64_str);
static Error Decode(const std::string& b64_str, std::string& result);
};
欢迎交流:VX:hanbing6174(注明来意,直说问题) 邮箱:hanbing6174@163.com