您的位置首页 >Mac >

<img class="yuanchuan_images" title="原创" style="display: none;margin-right: 5px;" src="/d/public/images/yuanchuang.png">英创信息技术针对MAC地址的应用程序加密方法

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解英创信息技术针对MAC地址的应用程序加密方法问题。

在实际应用中,客户可能希望对自己的程序添加验证过程,使得无法被随意拷贝到其它板子上使用。英创手臂武器袖子装备系列工控主板都配有唯一指定麦克,我们可以根据测量与控制(测量和控制)地址,生产加密字符串,存入键文件或是注册表内。然后在程序启动部分添加验证代码,验证这个字符串,从而达到防拷贝的目的。

本文介绍测量与控制(测量和控制)的获得方式及几种常用的加密方式。

验证设备

在验证测量与控制(测量和控制)之前,首先应当检查使用的板卡型号,以检查EM9281为例,代码如下。

添加头文件及宏定义,此部分代码均包含在板子对应软件开发工具包(软件开发工具包)包中的bsp_drivers.h下

#包括

extern ' c ' _ _ declspec(dllimport)boolkneriocontrol(DWORDdwIoControlCode,

LPVOID lpInBuf,

DWORD nInBufSize,

LPVOID发威,

DWORD nOutBufSize,

LPDWORD lpBytesReturned);

#定义octl _ HAL _ BOARD _ STATE _ READ CTL _ CODE(FILE _ DEVICE _ HAL,4024,METHOD_BUFFERED,FILE_ANY_ACCESS)

#defineEM9280_BOARD_TYPE_9280 0

#定义em 9280 _ BOARD _ TYPE _ 9281 1//-EM9281

#defineEM9280_BOARD_TYPE_9380 2

#defineEM9280_BOARD_TYPE_9283 3

# define em 9280 _ BOARD _ TYPE _ ES 9281 4//-ES 9281

#defineEM9280_BOARD_TYPE_9287 7

#定义em 9280 _ BOARD _ CFG _ SHIFT 14

#定义em 9280 _ BOARD _ CFG _ MASK0x 3

#定义em 9280 _ BOARD _ TYPE _ SHIFT 4

#定义em 9280 _ BOARD _ TYPE _ MASK0x 7

#定义m928 x _ BOARD _ TYPE _ BASE(v)((v EM9280 _ BOARD _ TYPE _ SHIFT)EM9280 _ BOARD _ TYPE _ MASK)

# definem 928 x _ BOARD _ TYPE _ SUB _ ID(v)((v EM9280 _ BOARD _ CFG _ SHIFT)EM9280 _ BOARD _ CFG _ MASK)

#定义em 9287 _ BOARD _ TYPE _ SUB _ TYPE(v)((EM928 X _ BOARD _ TYPE _ SUB _ ID(v)=1)?EM9280_BOARD_TYPE_9281:\

(em928 x _ BOARD _ TYPE _ SUB _ ID(v)=2)?em 9280 _ BOARD _ TYPE _ es 9281: em 9280 _ BOARD _ TYPE _ 9287)

# define EM 928 x _ BOARD _ TYPE _ ALL(v)((EM

928X_BOARD_TYPE_BASE(v)==EM9280_BOARD_TYPE_9287)? EM9287_BOARD_TYPE_SUB_TYPE(v):EM928X_BOARD_TYPE_BASE(v))

检查板卡型号,以EM9281为例

BOOL bRet;

DWORD dwReturnBytes;

DWORD dwBoardInfo = 0;

dwReturnBytes = 0;

bRet = KernelIoControl(IOCTL_HAL_BOARD_STATE_READ,

NULL, 0,

(LPVOID)&dwBoardInfo,sizeof(DWORD),

&dwReturnBytes);

If(EM928X_BOARD_TYPE_ALL(dwBoardInfo)!= EM9280_BOARD_TYPE_9281)return;

获得MAC地址

必要的头文件和lib库

#include"Iphlpapi.h"

#pragmacomment(lib,"Iphlpapi.lib")

VOIDGetMAC(BYTE* buf)

{

DWORD dwRetVal;

IP_ADAPTER_INFO AdapterInfo[4];

ULONG OutBufLen =sizeof(IP_ADAPTER_INFO);

GetAdaptersInfo(&AdapterInfo[0], &OutBufLen);

GetAdaptersInfo(&AdapterInfo[0], &OutBufLen);

/*if(strcmp(AdapterInfo[0].AdapterName, "ENET1") != 0)

{

return;

}*/

memcpy(buf, AdapterInfo[0].Address, 6);

}

BYTE mac[6];

GetMAC(mac);

char macstr[16];

sprintf(macstr, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

加密策略

英创所有嵌入式板卡都拥有唯一的MAC地址,在对MAC地址加密后,生成唯一的加密KEY。同时程序中判断板卡信息,并验证这个加密KEY。这样可以保证程序必须处于正确的板卡中,并拥有正确的KEY文件,才能执行。

为了增加安全性,加大KEY文件破译难度,可以考虑以下处理

1、将MAC地址与常量字符串混合后,再进行加密,生成加密KEY。

2、多种加密手段结合使用,多次加密。

3、验证失败后“软”关闭程序,可以做延迟处理,并可以考虑重启设备,增加暴力破解KEY的难度。

加密程序流程

获得板卡MAC地址à 执行加密函数à 生成KEY文件置入板卡中

解密程序流程

查询板卡MACà执行加密函数à读取KEY文件中密钥并对比à判断验证是否成功并进行后续执行

读取KEY文件中密钥à执行解密函数à查询板卡MAC并对比à判断验证是否成功并进行后续执行

加密方法

常用的加密方法有很多,可以参考文章《常用加密方法及代码》。同时英创提供这些加密算法相关测试例程,如有需要,可以联系英创工程师获得。

在实际应用中,客户可能希望对自己的程序添加验证过程,使得无法被随意拷贝到其它板子上使用。英创ARM系列工控主板都配有唯一指定MAC,我们可以根据MAC地址,生产加密字符串,存入KEY文件或是注册表内。然后在程序启动部分添加验证代码,验证这个字符串,从而达到防拷贝的目的。

本文介绍MAC的获得方式及几种常用的加密方式。

验证设备

在验证MAC之前,首先应当检查使用的板卡型号,以检查EM9281为例,代码如下。

添加头文件及宏定义,此部分代码均包含在板子对应SDK包中的bsp_drivers.h下

#include

extern"C"__declspec(dllimport) BOOLKernelIoControl( DWORDdwIoControlCode,

LPVOID lpInBuf,

DWORD nInBufSize,

LPVOID lpOutBuf,

DWORD nOutBufSize,

LPDWORD lpBytesReturned);

#defineIOCTL_HAL_BOARD_STATE_READ CTL_CODE(FILE_DEVICE_HAL, 4024, METHOD_BUFFERED, FILE_ANY_ACCESS)

#defineEM9280_BOARD_TYPE_9280 0

#defineEM9280_BOARD_TYPE_9281 1 // -> EM9281

#defineEM9280_BOARD_TYPE_9380 2

#defineEM9280_BOARD_TYPE_9283 3

#defineEM9280_BOARD_TYPE_ES9281 4 // -> ES9281

#defineEM9280_BOARD_TYPE_9287 7

#defineEM9280_BOARD_CFG_SHIFT 14

#defineEM9280_BOARD_CFG_MASK 0x3

#defineEM9280_BOARD_TYPE_SHIFT 4

#defineEM9280_BOARD_TYPE_MASK 0x7

#defineEM928X_BOARD_TYPE_BASE(v) ((v >> EM9280_BOARD_TYPE_SHIFT) & EM9280_BOARD_TYPE_MASK)

#defineEM928X_BOARD_TYPE_SUB_ID(v) ((v >> EM9280_BOARD_CFG_SHIFT) & EM9280_BOARD_CFG_MASK)

#defineEM9287_BOARD_TYPE_SUB_TYPE(v) ((EM928X_BOARD_TYPE_SUB_ID(v)==1)? EM9280_BOARD_TYPE_9281:\

(EM928X_BOARD_TYPE_SUB_ID(v)==2)? EM9280_BOARD_TYPE_ES9281: EM9280_BOARD_TYPE_9287)

#defineEM928X_BOARD_TYPE_ALL(v) ((EM928X_BOARD_TYPE_BASE(v)==EM9280_BOARD_TYPE_9287)? EM9287_BOARD_TYPE_SUB_TYPE(v):EM928X_BOARD_TYPE_BASE(v))

检查板卡型号,以EM9281为例

BOOL bRet;

DWORD dwReturnBytes;

DWORD dwBoardInfo = 0;

dwReturnBytes = 0;

bRet = KernelIoControl(IOCTL_HAL_BOARD_STATE_READ,

NULL, 0,

(LPVOID)&dwBoardInfo,sizeof(DWORD),

&dwReturnBytes);

If(EM928X_BOARD_TYPE_ALL(dwBoardInfo)!= EM9280_BOARD_TYPE_9281)return;

获得MAC地址

必要的头文件和lib库

#include"Iphlpapi.h"

#pragmacomment(lib,"Iphlpapi.lib")

VOIDGetMAC(BYTE* buf)

{

DWORD dwRetVal;

IP_ADAPTER_INFO AdapterInfo[4];

ULONG OutBufLen =sizeof(IP_ADAPTER_INFO);

GetAdaptersInfo(&AdapterInfo[0], &OutBufLen);

GetAdaptersInfo(&AdapterInfo[0], &OutBufLen);

/*if(strcmp(AdapterInfo[0].AdapterName, "ENET1") != 0)

{

return;

}*/

memcpy(buf, AdapterInfo[0].Address, 6);

}

BYTE mac[6];

GetMAC(mac);

char macstr[16];

sprintf(macstr, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

加密策略

英创所有嵌入式板卡都拥有唯一的MAC地址,在对MAC地址加密后,生成唯一的加密KEY。同时程序中判断板卡信息,并验证这个加密KEY。这样可以保证程序必须处于正确的板卡中,并拥有正确的KEY文件,才能执行。

为了增加安全性,加大KEY文件破译难度,可以考虑以下处理

1、将MAC地址与常量字符串混合后,再进行加密,生成加密KEY。

2、多种加密手段结合使用,多次加密。

3、验证失败后“软”关闭程序,可以做延迟处理,并可以考虑重启设备,增加暴力破解KEY的难度。

加密程序流程

获得板卡MAC地址à 执行加密函数à 生成KEY文件置入板卡中

解密程序流程

查询板卡MACà执行加密函数à读取KEY文件中密钥并对比à判断验证是否成功并进行后续执行

读取KEY文件中密钥à执行解密函数à查询板卡MAC并对比à判断验证是否成功并进行后续执行

加密方法

常用的加密方法有很多,可以参考文章《常用加密方法及代码》。同时英创提供这些加密算法相关测试例程,如有需要,可以联系英创工程师获得。

.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content: "广告"; } .dfma img { display: block; }
免责声明:本文由用户上传,与本网站立场无关,如有侵权请联系删除!财经信息仅供读者参考,并不构成投资建议,投资者据此操作,风险自担。

今日大家都在搜的词: