基于HTTP請(qǐng)求通過(guò)外接串口服務(wù)器實(shí)現(xiàn)MCGS組態(tài)屏(TPC7062Ti)云端授權(quán)系統(tǒng)搭建,重點(diǎn)講解如何實(shí)現(xiàn)系統(tǒng)對(duì)時(shí)(基于UDP協(xié)議的NTP對(duì)時(shí)協(xié)議)、加密算法的選擇、加密算法的設(shè)計(jì)與實(shí)現(xiàn)。
MCGS組態(tài)屏授權(quán)管理可以通過(guò)“開(kāi)發(fā)平臺(tái)”內(nèi)置的“用戶權(quán)限管理”,這種方式基本屬于一次配置授權(quán)永久有效,而現(xiàn)在介紹的這種授權(quán)方式可以利用云平臺(tái)修改設(shè)備授權(quán)狀態(tài),實(shí)現(xiàn)更加可控的設(shè)備管理。
通過(guò)MCGS實(shí)現(xiàn)云端授權(quán)有幾個(gè)難點(diǎn),如何將MCGS組態(tài)屏接入互聯(lián)網(wǎng),如何連接管理服務(wù)器,如何進(jìn)行數(shù)據(jù)加密與解密,如何獲取當(dāng)前時(shí)間戳(非MCGS時(shí)間戳)等困難。
“接入互聯(lián)網(wǎng)”可以使用市場(chǎng)上常見(jiàn)的串口轉(zhuǎn)4G串口服務(wù)器、串口轉(zhuǎn)WIFI串口服務(wù)器、串口轉(zhuǎn)以太網(wǎng)串口服務(wù)器設(shè)備實(shí)現(xiàn),其中串口轉(zhuǎn)4G對(duì)于需要移動(dòng)的應(yīng)用場(chǎng)景有著不可替代性,但這種方式存在流量費(fèi)用。一般來(lái)說(shuō)MCGS組態(tài)屏應(yīng)用于固定環(huán)境,此時(shí)可以采用串口轉(zhuǎn)WIFI串口服務(wù)器或者串口轉(zhuǎn)以太網(wǎng)串口服務(wù)器,WIFI相對(duì)于以太網(wǎng)穩(wěn)定性較差且易受干擾,接下來(lái)小編就采用MCGS組態(tài)屏連接串口轉(zhuǎn)以太網(wǎng)的NA111串口服務(wù)器實(shí)現(xiàn)設(shè)備上網(wǎng)。
“連接管理服務(wù)器”為了方便我就直接采用OneNET的HTTP服務(wù)器實(shí)現(xiàn),應(yīng)用場(chǎng)景并不復(fù)雜,只需要定義一個(gè)字符型變量,并且可以通過(guò)“GETPOST”請(qǐng)求或修改變量就行。
“獲取當(dāng)前時(shí)間戳”可以通過(guò)串口服務(wù)器NA111連接NTP服務(wù)器通過(guò)NTP協(xié)議獲取準(zhǔn)確時(shí)間戳,這里我就通過(guò)中國(guó)國(guó)家授時(shí)中心(ntp.ntsc.ac.cn:123)的NTP服務(wù)器獲取時(shí)間。
【注】網(wǎng)絡(luò)時(shí)間協(xié)議,英文名稱:Network Time Protocol(NTP)是用來(lái)使計(jì)算機(jī)時(shí)間同步化的一種協(xié)議。
這幾個(gè)難點(diǎn)中最難的是如何對(duì)數(shù)據(jù)進(jìn)行加密,利用MCGS腳本開(kāi)發(fā)進(jìn)行數(shù)據(jù)的加密與解密是比較困難,若一個(gè)加密不能被該理解的設(shè)備所理解這樣的加密是沒(méi)有意義的,而MCGS并不支持使用加密庫(kù)函數(shù)導(dǎo)致加密解密都需要從原理自行封裝腳本,導(dǎo)致不能使用運(yùn)算過(guò)于復(fù)雜的算法,常見(jiàn)的加密算法有對(duì)稱加密和非對(duì)稱加密和散列算法,接下來(lái)分析哪個(gè)算法適合MCGS腳本加密,先從安全級(jí)別較高的非對(duì)稱加密分析。
非對(duì)稱加密算法,又稱為公開(kāi)密鑰加密算法。它需要兩個(gè)密鑰,一個(gè)稱為公開(kāi)密鑰(public key),即公鑰,另一個(gè)稱為私有密鑰 (private key),即私鑰,常見(jiàn)的非對(duì)稱加密算法有RSA、ECC等,他們都有運(yùn)算復(fù)雜且非常消耗MCU的算力,并不適用于組態(tài)屏的加密。
共享密鑰加密算法。在對(duì)稱加密算法中,使用的密鑰只有一個(gè),發(fā)送和接收雙方都使用這個(gè)密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密。這就要求加密和解密方事先都必須知道加密的密鑰。
散列算法,常見(jiàn)的有MD5、CRC16、SHA1等,嚴(yán)格來(lái)說(shuō)他們不能算作加密算法而是摘要算法,他們加密的結(jié)果是不可逆的,常被用于文件完整性以及數(shù)字簽名等場(chǎng)景。
現(xiàn)在就只剩下了對(duì)稱加密,AES、DES、3DES等都屬于對(duì)稱加密,對(duì)稱加密結(jié)果是可逆的,算法可以簡(jiǎn)單可以復(fù)雜,對(duì)于筆者來(lái)說(shuō),使用組態(tài)屏的腳本程序?qū)崿F(xiàn)AES、DES、3DES仍有些困難,并且寫這樣腳本有點(diǎn)違背使用MCGS的初衷(開(kāi)發(fā)簡(jiǎn)單),MCGS的加密腳本就只能使用對(duì)稱加密的思想來(lái)實(shí)現(xiàn)。
上述這么多的算法留著給那些有興趣,并且熟悉MCGS腳本開(kāi)發(fā)的人自行探索,筆者這里就是用密碼本加密,為了方便前端開(kāi)發(fā),就使用Base64編碼表再結(jié)合Base64格式化文本實(shí)現(xiàn)數(shù)據(jù)加密,若認(rèn)為這樣的算法不可靠,可以對(duì)明文進(jìn)行“加”“減”進(jìn)一步加密,不建議使用“乘”“除”“與”“或”“非”“異或”這些可能導(dǎo)致數(shù)據(jù)不可逆的算法,這里就不再額外加密明文。
使用Base64就需要了解Base64,Base64算法很簡(jiǎn)單只需要把3個(gè)8位字節(jié)(3*8=24)轉(zhuǎn)化為4個(gè)6位的字節(jié)(4*6=24),之后在6位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式。如果剩下的字符不足3個(gè)字節(jié),則用0填充,輸出字符使用'=',因此編碼后輸出的文本末尾可能會(huì)出現(xiàn)1或2個(gè)'=',使用MCGS腳本實(shí)現(xiàn)這一操作也不算簡(jiǎn)單但可以實(shí)現(xiàn),先將Base64編碼表使用字符串變量一一存儲(chǔ),比如將base64_list的初值賦予“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”,也可以自定義密碼本(每個(gè)字符都必須唯一對(duì)應(yīng))對(duì)應(yīng)的加密時(shí)也需要使用對(duì)于密碼本加密,上述字符串順序不可亂,亂了就是不再是Base64編碼表。
通過(guò)!InStr(1,base64_list,”M”)查找加密字符的碼值,解出的碼值使用!I2Bin(s)轉(zhuǎn)換為二進(jìn)制字符(不足6字節(jié)前面填零),再通過(guò)字符串拼接合成原始二進(jìn)制字符串,將“=”忽略不轉(zhuǎn)換(因?yàn)锽ase64把三個(gè)字節(jié)分成四個(gè)字節(jié),不足3個(gè)字節(jié),則用0填充,輸出字符使用'='),使用!Mid(str,1,8)和!Bin2I(s)轉(zhuǎn)換為ASCII碼值,在使用!I2Ascii(s)轉(zhuǎn)換為ASCII字符,拼接這些字符串就可以得到明文。
解決了怎么加密,現(xiàn)在需要考慮對(duì)什么數(shù)據(jù)進(jìn)行加密,這取決于我們要實(shí)現(xiàn)怎樣的授權(quán)系統(tǒng),比如,實(shí)現(xiàn)云端修改賬戶模式,這樣就需要預(yù)先定義模式對(duì)應(yīng)碼值表(9573-長(zhǎng)期授權(quán),6685-授權(quán)1天等等),為了保證碼值的安全甚至可使用當(dāng)前時(shí)間對(duì)碼值進(jìn)行保護(hù),實(shí)現(xiàn)動(dòng)態(tài)密鑰。或者利用云端設(shè)置有效時(shí)間,也就是需要對(duì)結(jié)束時(shí)間的時(shí)間戳進(jìn)行加密。
本文僅探討算法和實(shí)現(xiàn)方法,有時(shí)間再講解算法的實(shí)現(xiàn)。
今天的分享就到這里啦,EBYTE每一天都致力于更好的助力物聯(lián)化、智能化、自動(dòng)化的發(fā)展,提升資源利用率,更多串口服務(wù)器、數(shù)傳電臺(tái)、lora模塊等無(wú)線數(shù)傳模塊產(chǎn)品更多資料,感興趣的小伙伴可以登錄我們的億佰特官網(wǎng)和企業(yè)公眾號(hào)(微信號(hào):cdebyte)進(jìn)行了解,也可以直接撥打400電話咨詢技術(shù)專員!