证书

在每块sHMIctrl显示屏存储器中,都有一个绑定硬件参数的数字证书,以确保sHMIctrl本身设备不会被盗版,而在这个体系中,我们更引入了企业二级证书的概念,用于企业产量的商业发行和量产

使用步骤:

1)整个sHMI工程已经完工,测试完成,可以进入商业发行封装步骤

2)模拟效果

==注意:调试期间,不要加这段代码,加上之后就意味着刷入屏幕之后,没有写证书的话将不能正常工作!==

void onCertERR()
{
    cls(0);
    echo ("需要授权企业量产证书方可使用");
    ds(16,0,0,"需要授权企业量产证书方可使用",1);
}

onCertERR事件是指在启动每一个页面的时候,如果系统没有证书,将直接调用本函数,在函数内部能可以根据需求,自行使用绘图语句构建显示界面,在本例中我们只是单纯的显示一行字;

在主界面参数中,调整企业量产模拟状态为模拟非法企业证书,然后运行本代码:

可以看到执行结果,此时把屏幕代码复制到屏上,也会出现此界面,若要屏幕正常执行,需要继续下面步骤写入证书。

3)申请账号

目前这个阶段只提供手工申请,请提供以下资料给旺旺,由我们的工程师在服务器上建立根证书,未来将建立自动维护界面:

项目 内容 说明
用户手机号 不可更改,将来用于身份验证
联系人姓名
公司名称 公司的全称
产品名称 不同的程序工程使用不同的产品名称,可以是一个主产品+后缀来区分不同的产品分支,确定后不可修改
使用硬件产品型号 给出序列号的头2个字母也可以
授权数量

处理之后,旺旺将返回5个参数(请注意妥善保管,为保证安全,密钥是一次性计算得到的,数据库中无存储,也就是说我们也无法二次查询到,除非重新计算):

名称 类型 说明
COMID 字符串 公司的编码,同一账号下该编码一致,相当于身份ID
COMKEY 字符串 量产证书的key,一款产品一个;
k1 数字 企业证书运算的k1(公钥)
k2 数字 企业证书运算的k2(公钥)
k3 数字 企业证书密匙

一个公司可以同时申请多个key,也就是说同一个产品名称允许有多个comkey,这样比如给多个加工厂同时生产这一个产品,可以分别给出授权。

将申请k1 和k2公钥填入工程的Ini参数区:

4)写入证书

方法:

在此输入comid 和 comkey 点击测试:

此时可以看到该证书对应的屏幕标志是ND,授权数量20,已经使用了1个,产品名称是vatest;

串口接好sHMIctrl屏幕,点击“连接” 连接串口,然后点击“写证书”,屏幕出现接收端:RegOK 表示证书写入完成;

此时,再重启屏幕,可以看到程序将正常运行;

5)高级防范:

onCertERR 事件属于明面上的防范,说白了就是防君子不防小人的做法,由于事件名称等固定,因此对于一些能从汇编角度破解的人员来说,容易被破解,因此我们高级防范手段,就是将检测证书的功能嵌套到一些常用的语句中,由用户将这些代码放在一个特殊的位置上,起到意想不到的防范效果,下面将介绍几个:

int r;  //首先声明一个int变量
//96595871 是前面获取的k3的值
r=godialog(258,0);
if ((r!=0)&(r!=96595871)){
    //表示证书有问题
}

//---------------------
r=chr(258);
if ((r!=0)&(r!=96595871)){
    //表示证书有问题
}

//---------------------
r=asc("",99);
if ((r!=0)&(r!=96595871)){
    //表示证书有问题
}

==注意:在本例中k3=96595872,没有证书的前提下,当代码在PC模拟执行的时候,函数返回1;当代码在sHMIctrl上执行的时候,系统返回密匙k3;==

当然,k3这个值最好也不要直接出现在程序中,直接出现可以通过bin文件二进制搜索这个值找到位置修改,建议k3应该是一个变量计算而来,并且最好和程序的其他变量互动,这样安全指数就更高了。

这些代码可以选择一些核心且不是很频繁调用的地方,比如某个显示界面,每2000~3000次刷新才检测证书一次,这样让盗版者根本无法测试,也让盗版者根本不知道代码中有多少个“暗刺”;

对于购买超过100块的企业客户,可以在签署保密协议的情况下,我们提供更多的这种伪装检测函数文档,用于更大程度的保密需求;