安全问题要解决的是
1,别人无法使用设备
2,要抵御一定的嗅探
要做到别人无法使用设备,首先我们无法阻止别人扫描设备并且连接设备,我们能做的是连接设备后的鉴权过程,即如果无法通过鉴权则断开设备。通常鉴权的方式是设备和手机本地都保存一个token,连接建立后对比两方的token,如果匹配则鉴权成功。这里给出一个典型的通信方案:
一,当设备首次使用,设备中还无token时,走注册流程
1,首先向设备发送注册指令常量,表示开始注册
2,然后手机端生成token,并通过秘钥keyA加密发给设备,秘钥可以为mac地址和设备的类型id生成的
3,设备端收到后,解密出token,同时在keyA的基础上再通过秘钥keyB加密一次发回给手机端,秘钥keyB同样为设备mac地址和设备的类型id生成的,只不过算法不一样,这个算法是和手机端约定好的
4,手机端收到后,用keyA和keyB两层解密出token,和本地对比,看是否一致。
5,手机端用token作为秘钥,加密一个固定常量发给设备,表示注册成功。设备收到后,会将token正式存储起来。
二,当设备中已有token时,走登录流程
1,首先向设备发送登录的指令常量,表示开始登录
2,设备端向手机端推送current tick,用token加密的,这个tick是每次连接会递增的,设备断点会复位。
3,手机端解密出tick,然后用token+tick作为秘钥,加密一个常量发给设备
4,设备端解密后对比该常量,如果正确则同样用token+tick作为秘钥发送另一个常量给手机
5,手机收到后用token+tick作为秘钥解密出常量后,看是否正确,如果是则登录成功,如果没收到设备推送则表示失败。
另外抵御嗅探最主要的两个方面就是:加密和防重放。加密的包括token,控制指令,数据等。 token相当于控制设备的钥匙,每当要操作设备时,都需要核实token,token在手机和设备之间传递时是通过秘钥加密过的,所以就算别人截获了,如果不知道秘钥和加密算法也无法破解。另一个是防重放,总体来说,都是数据中带有一个序号,这个序号有一个有效窗口,在这个有效窗口内的请求被认为是有效的,否则认为是无效的。序号通常有三种:
时间戳 ,下次请求的时间戳必须和上次请求有一个时间差,比如大于5s,否则认为是重放。这个窗口不能设置的太小了,太小了防重放就没有作用,太大了会导致正常的网络请求被屏蔽。
递增序列,每次操作都递增序列号,如果收到的序列号没有递增,则丢弃。比如手机遥控电视,手机每发出一次指令,序列号就加一,电视会保存这个序列号,但是遥控器不能每次发指令都保存序列号,因为要省电,并且flash的写次数是有限制的,所以要隔一个周期写入,比如满100写入一次。如果中途设备断电导致序列号丢失了,则下次上电时需要加上一个周期。
随机数,每次都生成一个随机数,服务端会将最近一段时间收到的序列号保存下来,如果发现收到的序列号已经存在了就认为是重放,因为是随机数,所以碰撞的概率极小。