本帖最后由 LyCrystal 于 2017-2-19 14:48 编辑
年前收到的板子,到现在才开始写帖子真是惭愧呀。
首先介绍一下出发点:
由于一台设备工作的时候需要很多参数,有些是用户设定的。而有些是厂家设定的且不适宜让用户改变。便有了后台参数。由于通过封堵后台参数入口的方式防止修改后台参数的方法安全性过低。尤其是对于本测试平台所使用的迪文屏幕。很容易通过抓取串口上的数据绕过密码进入后台。所以设计了当前的鉴权系统。通过对传入参数与当前权限等级的匹配鉴别当前用户的权限。大大加强系统的安全性。
接下来介绍一下硬件平台:1.Nucleo-F413ZH st的官方开发板。2.DGUS电阻触摸屏;
1、Nucleo-F413板子不用多说,大家都很熟悉了。论坛也有详细的评测**我就不废话了。
2、DGUS电阻触摸屏,(不是打广告,只是刚好有一个)是迪文公司开发的串口屏,可选RS232电平,或是ttl电平。
DGUS的数据传递是依靠地址的。写对应的地址修改相应的显示变量。没用的坛友把地址当成寄存器就行,一个地址可以对应一个或多个屏幕上的值。同样,在屏幕上输入的值也是以地址判断来自哪个元素。这样一来就可以将地址分为多组,每组地址对应一个权限等级。当当先权限等级低于所需的权限等级的时候,跳转到密码输入界面,等待用户输入密码以提升权限。
3、密码验证方式可定制。可以选用固定密码,可修改密码。或是动态密码。为了验证方便,我使用了固定密码。
下面介绍一下Demo:
测试页面分为5页,欢迎页面,主页面,Level1参数,Level2参数,Level3参数。
Addr<=0x0010 //权限控制
Addr>=0x0010)&&(Addr<=0x00FF //Main Page;
Addr>=0x0100)&&(Addr<=0x0200 //Param level 1;
Addr>=0x0200)&&(Addr<=0x0300 //Param level 2;
Addr>=0x0300)&&(Addr<=0x0400 //Param level 3
根据地址的不同将数据散装到相应的子程序中进行处理。
具体的处理过程:
void guiLevel1Exec(uint8_t execSig)
{
int16_t data = (execPkg.Data[0]<<8)+execPkg.Data[1];
int32_t uldata = (execPkg.Data[0]<<24)+(execPkg.Data[1]<<16)+(execPkg.Data[2]<<8)+(execPkg.Data[3]);
if(AccCheck(1)){
AccSetOrigPage(GuiLevel1Page);
DGUS_SwiPage(GuiAccessPage);
}
switch(execPkg.Addr)
在每个子程序的入口都有AccCheck()检验权限。参数为所需要的权限等级。如果权限等级不够高,则跳转到密码输入界面。
int8_t AccLevelInc(uint32_t SecNum)
{
switch(AccHanler.AimAccLevel)
{
case 1:
if(SecNum==121){ //改等级权限所需的密码
AccHanler.CurAccLevel=1;
}
break;
case 2:
if(SecNum==122){
AccHanler.CurAccLevel=2;
}
break;
case 3:
if(SecNum==123){
AccHanler.CurAccLevel=2;
}
break;
default:
break;
}
DGUS_SwiPage(AccHanler.OrigPage);
return AccHanler.CurAccLevel;
}
这是检验密码是否正确的相关代码。如果正确,则提升到相应的权限。错误处理机制根据实际形况自行添加。
第一部分的内容就到此。测试工程,及测i是过程在第二帖中发布。
|