术语解释:
ECC(椭圆曲线密码学) | 一种建立公开密钥加密的算法,基于椭圆曲线数学 |
---|---|
ECDHE | 基于ECC的密钥交换算法,计算速度快 |
HMAC(散列消息认证码) | 是一种通过特别计算方式之后产生的消息认证码(MAC),使用密码散列函数,同时结合一个加密密钥。可用来保证数据的完整性。 |
SessionKey(会话密钥) | 随机生成的密钥,用来加密会话过程中传输的数据 |
MasterKey(主密钥) | 通过ECDHE算法生成,用来加密SessionKey |
chacha算法 | 一种新式对称加密算法,适用于ARM设备,计算速度快 |
关键词:
轻量级、链路加密、密钥安全、IOT安全
一、嵌入式IOT设备通信加密现状
考虑到大部分的嵌入式IOT设备存在资源有限,计算能力不足,无法运行标准的TLS加密协议,或者缺少存储空间放置体积较大的加密库等情况。
部分IOT产品可以通过增加性能或者添加加密硬件的方式运行标准加密协议,但是此类方法会增加开发成本,不适用于产品研发经费有限的情况或单机片类产品。常见的性能较弱的IOT产品通常使用单一的对称加密算法对数据流进行加密传输,或者不加密传输。使用单一对称加密算法对数据流进行加密存在较多的弱点,可以被恶意第三方破解或利用,如:预共享密钥多次加密数据,存在被破解的可能,缺少防御重放攻击的手段,缺少鉴别加密后数据完整性的手段。
二、加密协议基本结构
通常,加密协议涉及到的数据加密过程可分为三个部分:加密密钥生成、数据加密、数据完整性和真实性校验。密钥生成的过程可以概述为发送端和接收端通过交换公钥,使用ECDHE算法分别得出完全相同的主密钥。在计算出主密钥后,使用随机数生成会话密钥,结合对称加密算法,使用会话密钥对需要传输的数据进行加密,并使用散列消息认证码确保数据的完整性和真实性。
协议参与者交互流程:
(一)MasterKey生成阶段(基于ECDHE):
- 发送端使用随机数生成SessionKey、ks。
- 发送端从接收端获取椭圆曲线E、基点B(x,y)、接收端公钥Kr。
- 发送端使用Ks = ks * B(x,y)得出发送端ECC公钥,ks作为发送端ECC私钥。
- 发送端发送Ks给接收端。
- 发送端计算M= ks * Kr,接收端计算M= kr * Ks,M为MasterKey。
流程图如下:
(二)发送端数据加密封装阶段:
使用Sessionkey加密业务数据,加密算法为ChaCha,加密后的业务数据作为报文主体。
使用MasterKey加密SessionKey,加密算法为AES-256-ECB。
将Version、服务端公钥标志、数据编号、加密后的SessionKey、发送端公钥组合成报文头部。
报文头部示意图:
|version| | receiverpublickeyflag | | dataid | | encryptedsessionkey | | senderpublickey |
--------------------------------------------------------------------------------------
[HEADER]
使用sha256计算报文头部和报文主体哈希值。
使用MasterKey计算报文头部和报文主体哈希值的hmac_sha256,公式:
hmac_sha256(MasterKey, sha256(header)+sha256(body))。
- 将计算出来的hmac_sha256(MasterKey,
sha256(header)+sha256(body))的值signature作为报文尾部。
报文数据结构:
struct {
ProtocolVersion version;
ReceiverPublicKeyFlag receiverpublickeyflag;
DataId dataid;
EncryptedSessionKey encryptedsessionkey;
SenderPublicKey senderpublickey;
Data data;
Signature signature;
} Ciphertext;
报文结构示意图:
|version| |receiverpublickeyflag| |dataid| |encryptedsessionkey|
|senderpublickey| | data | signature |
------------------------|-------------|------------------|
[HEADER] | [BODY] | [TAIL] |
(三)接收端校验解密阶段:
- 接收端接收到加密后的数据包后,使用hmac_sha256(MasterKey,
sha256(header)+sha256(body))计算签名的值。 - 将计算出来的签名和数据包的signature进行比对,相同则继续处理,不相同则丢弃该数据包。
- 记录dataid,若出现重复的dataid,则丢弃包含重复dataid的数据包。
- 取出数据包中加密后的SessionKey,使用MasterKey进行解密,获取SessionKey。
- 使用SessionKey解密加密后的数据,获取原始数据。
流程图如下:
三、设计思路总结
相对于复杂的标准TLS协议,我们可根据业务的实际场景选择所需的安全模块,以插装的方式组合一款私有加密协议,从而降低延时、提高载荷比、降低秘钥管理的复杂度。相对与单一加密方式,可有效防御重放攻击,保证数据的完整性和真实性,进一步提升加密密钥的安全性。
四、有益效果
考虑到越来越复杂的网络环境,在主流IOT设备计算资源不足的条件下,实现一种更轻量级的数据流加密方法,通过组合利用各类标准加密算法的优势,在资源有限的条件下也可以保证数据流的安全性,确保加密后的数据不会遭到破解,也无法被重复利用,保障IOT设备之间通信的安全性。