"); //-->
MCGS用户程序云端授权系统设计
基于HTTP请求通过外接串口服务器实现MCGS组态屏(TPC7062Ti)云端授权系统搭建,重点讲解如何实现系统对时(基于UDP协议的NTP对时协议)、加密算法的选择、加密算法的设计与实现。
MCGS组态屏授权管理可以通过“开发平台”内置的“用户权限管理”,这种方式基本属于一次配置授权永久有效,而现在介绍的这种授权方式可以利用云平台修改设备授权状态,实现更加可控的设备管理。
通过MCGS实现云端授权有几个难点,如何将MCGS组态屏接入互联网,如何连接管理服务器,如何进行数据加密与解密,如何获取当前时间戳(非MCGS时间戳)等困难。
1.接入互联网
“接入互联网”可以使用市场上常见的串口转4G串口服务器、串口转WIFI串口服务器、串口转以太网串口服务器设备实现,其中串口转4G对于需要移动的应用场景有着不可替代性,但这种方式存在流量费用。一般来说MCGS组态屏应用于固定环境,此时可以采用串口转WIFI串口服务器或者串口转以太网串口服务器,WIFI相对于以太网稳定性较差且易受干扰,接下来小编就采用MCGS组态屏连接串口转以太网的NA111串口服务器实现设备上网。
2.连接管理服务器
“连接管理服务器”为了方便我就直接采用OneNET的HTTP服务器实现,应用场景并不复杂,只需要定义一个字符型变量,并且可以通过“GET\POST”请求或修改变量就行。
3.获取时间戳
“获取当前时间戳”可以通过串口服务器NA111连接NTP服务器通过NTP协议获取准确时间戳,这里我就通过中国国家授时中心(ntp.ntsc.ac.cn:123)的NTP服务器获取时间。
【注】网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议。
数据加密
这几个难点中最难的是如何对数据进行加密,利用MCGS脚本开发进行数据的加密与解密是比较困难,若一个加密不能被该理解的设备所理解这样的加密是没有意义的,而MCGS并不支持使用加密库函数导致加密解密都需要从原理自行封装脚本,导致不能使用运算过于复杂的算法,常见的加密算法有对称加密和非对称加密和散列算法,接下来分析哪个算法适合MCGS脚本加密,先从安全级别较高的非对称加密分析。
1.非对称加密
非对称加密算法,又称为公开密钥加密算法。它需要两个密钥,一个称为公开密钥(public key),即公钥,另一个称为私有密钥 (private key),即私钥,常见的非对称加密算法有RSA、ECC等,他们都有运算复杂且非常消耗MCU的算力,并不适用于组态屏的加密。
共享密钥加密算法。在对称加密算法中,使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行加密和解密。这就要求加密和解密方事先都必须知道加密的密钥。
2.散列算法
散列算法,常见的有MD5、CRC16、SHA1等,严格来说他们不能算作加密算法而是摘要算法,他们加密的结果是不可逆的,常被用于文件完整性以及数字签名等场景。
3.对称加密
现在就只剩下了对称加密,AES、DES、3DES等都属于对称加密,对称加密结果是可逆的,算法可以简单可以复杂,对于笔者来说,使用组态屏的脚本程序实现AES、DES、3DES仍有些困难,并且写这样脚本有点违背使用MCGS的初衷(开发简单),MCGS的加密脚本就只能使用对称加密的思想来实现。
上述这么多的算法留着给那些有兴趣,并且熟悉MCGS脚本开发的人自行探索,笔者这里就是用密码本加密,为了方便前端开发,就使用Base64编码表再结合Base64格式化文本实现数据加密,若认为这样的算法不可靠,可以对明文进行“加”“减”进一步加密,不建议使用“乘”“除”“与”“或”“非”“异或”这些可能导致数据不可逆的算法,这里就不再额外加密明文。
使用Base64就需要了解Base64,Base64算法很简单只需要把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'=',使用MCGS脚本实现这一操作也不算简单但可以实现,先将Base64编码表使用字符串变量一一存储,比如将base64_list的初值赋予“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”,也可以自定义密码本(每个字符都必须唯一对应)对应的加密时也需要使用对于密码本加密,上述字符串顺序不可乱,乱了就是不再是Base64编码表。
MCGS加密过程讲解
通过!InStr(1,base64_list,”M”)查找加密字符的码值,解出的码值使用!I2Bin(s)转换为二进制字符(不足6字节前面填零),再通过字符串拼接合成原始二进制字符串,将“=”忽略不转换(因为Base64把三个字节分成四个字节,不足3个字节,则用0填充,输出字符使用'='),使用!Mid(str,1,8)和!Bin2I(s)转换为ASCII码值,在使用!I2Ascii(s)转换为ASCII字符,拼接这些字符串就可以得到明文。
解决了怎么加密,现在需要考虑对什么数据进行加密,这取决于我们要实现怎样的授权系统,比如,实现云端修改账户模式,这样就需要预先定义模式对应码值表(9573-长期授权,6685-授权1天等等),为了保证码值的安全甚至可使用当前时间对码值进行保护,实现动态密钥。或者利用云端设置有效时间,也就是需要对结束时间的时间戳进行加密。
本文仅探讨算法和实现方法,有时间再讲解算法的实现。
文章来源:https://www.ebyte.com/new-view-info.html?id=2089
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
eleaction01 阅读:3093