程序软加密思路整理和设计实现

导言

行业应用软件加密分为软加密和硬加密。

硬加密优点是安全,但是具有一定硬件成本,并且需要把硬件夹馍狗送到用户手中,硬件狗还面临丢失的问题。软加密的特点和硬加密正好相反。

本文主要把自身产品的软加密思路做个梳理。

逻辑整理

核心思路有几点:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值