我有一个嵌入式系统通过HTTP将数据发布到JSON REST服务。我目前正在使用HMAC-SHA1进行身份验证,就像Amazon AWS一样。
我现在正在探索加密传输中数据的选项。 HTTPS似乎是逻辑选择,因为服务器端需要很少改变。但是,my microcontroller具有相对较小的闪存(256KB)和RAM(96KB),我能找到的唯一HTTPS客户端是商业产品。微控制器使用内置的“AES加密查找表”使加密更简单,但我猜我需要一种安全的方式来交换密钥。
我看过SSL,看起来很复杂。还有其他更轻松的选择吗?
答案 0 :(得分:5)
SSL的大多数复杂性来自高模块性。客户端可以支持几个“密码套件”,服务器选择一个。数据可以被压缩。客户端可以通过呈现其自己的证书并使用相应的私钥来验证自身。服务器公钥作为X.509证书发送,X.509证书验证很复杂。
您可以通过硬编码客户端选项来大幅简化SSL。例如,您决定只支持一个密码套件,例如TLS_RSA_WITH_AES_128_CBC_SHA256。没有压缩。您可以在客户端硬编码服务器公钥,只需忽略服务器发送的证书。如果可能,使用TLS 1.2,这需要使用单个散列函数(SHA-256)而不是两个(MD5和SHA-1)用于以前的协议版本(TLS是SSL的标准名称; TLS 1.0是SSL 3.1)。
我(专业地)实现了支持AES和3DES的TLS客户端,并执行基本的X.509验证(仅限RSA签名)。完整的代码适用于21 KB的ROM(对于ARM处理器,使用拇指指令编译的C代码),并且只需要19 KB的RAM,其中16 Kbytes用于输入缓冲区(输入记录的最大大小)假设没有压缩,SSL约为16千字节)。所以SSL 可以小到足够微控制器。
通过先验选择客户端选择的参数简化SSL后,您将获得一个尽可能轻量级的协议:剩余的复杂性是固有的。如果你试图让事情变得更简单,那么你最终会得到一些更弱的东西。
对于现有的实现,至少PolarSSL针对嵌入式设备,并且在开源许可证(GPLv2)下可用。我不知道它有多小可以收缩。还有CyaSSL,也可以根据GPLv2条款获得,并声称可编译为30 KB的代码占用空间(具有最少的选项)。
答案 1 :(得分:0)
SSL使用Diffie-Hellman(DH)进行密钥交换。我认为你可以在你的代码中相对容易地实现它(DH)。您需要考虑的唯一问题是DH本身并不反对中间人(MITM)攻击。有几种方法可以解决这个问题。维基百科的文章提到了它们,所以你有一些东西可以开始。