有些硬件设备总是与client配合使用,硬件设备只是提供硬件躯体,而client充当灵魂,实现最核心功能。因此client加密是非常必要的,不允许没有注册的或者非法的设备接入。为此我设计了一套加解密思路,下图展示了硬件device与client交互过程中注册与验证的思路:
系统由device、encrypt、sever和client四部分构成,其中device和client为产品的核心,而encrypt和server主要负责对device的加解密和身份验证。下面对整个的交互过程进行说明。
①encrypt读取device内部的特定数据plaintext,采用特定算法加密之后形成ciphertext,②并推送到server中,server将其缓存到product list中
③产品到了客户手里,客户打开client,启动client之后,client读取device特定的plaintext,然后采用与encrypt一样的加密算法进行加密运算,④把ciphertext推送到server,server将此次的ciphertext与列表中的ciphertext进行身份核对,核对通过后就锁定该ciphertext,此后该ciphertext不再拥有身份验证的权限,这样就可以避免已经注册备案过的device发生重复注册现象;⑤与此同时,server向device发送一个随机数,device将该随机数存放在特定的地方;接着server从该device中读取随机数,然后与刚刚发下去的进行比较,如果相同则设置设备在线标志,此后忽略client发来的相同ciphertext的处理请求;如果device离线则client设置离线标志,之后恢复处理client发来的ciphertext请求。
现在想一个问题,如果有人生产大量相同的设备,并伪造相同的plaintext,当这些设备接入client过程中会发什么呢?
首先,client会读取device的ciphertext;然后通过SHA1运算形成ciphertext,传输给server,server收到该ciphertext后发现它已经注册备案过,于是就去读取device的随机数(上次发给设备的随机数),读上来后与上次发下去的对比,如果相同则允许该device接入client,并设置设备在线标志,如果此时又有别的设备向client发送相同的plaintext以请求接入,client将该plaintext发送给server,server对它进行SHA1运算形成ciphertext,结果发现该ciphertext的设备已经在线,于是直接忽略此处client请求,从而device无法接入。下图为device接入client之后与server之间的数据交互流程图:
上述的方案可以有效的防止有些商家伪造验证数据来免费的接入别人的client,同一时刻只允许一台设备接入,即便很多台设备具备伪造数据的能力,但是server只允许同时只有一台设备在线,第一台接入了,第二台,第三台,第四台是无法接入的。因为server的档案里面的每一个ciphertext都是唯一的,不同的plaintext会产生不同的ciphertext。