2011-03-09 52 views
3

我有一个嵌入式系统通过HTTP向JSON REST服务发布数据。我目前使用HMAC-SHA1进行验证,与Amazon AWS一样。轻量级加密密钥交换协议

我现在正在探索加密传输中的数据的选项。 HTTPS似乎是合乎逻辑的选择,因为服务器端需要很少更改。然而,my microcontroller有一个相对较小的闪存(256KB)和RAM(96KB),我可以找到的唯一HTTPS客户端是商业产品。微控制器通过内置的“AES加密查找表”使加密变得更简单,但我猜测我需要一种安全的方式来交换密钥。

我看了一下SSL,它看起来相当复杂。任何其他更轻的选项?

回答

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 KB用于输入缓冲区(输入记录的最大尺寸为假设没有压缩,SSL约为16千字节)。所以SSL 可以对于微控制器来说足够小。

一旦通过客户机挑选的参数的先验选择简化SSL,会得到一个协议,该协议是约轻量级因为它可以得到:剩余复杂性是本征的。如果你试图让事情变得更简单,那么你最终会变得更弱。

至于现有实现方式中,至少PolarSSL旨在嵌入式设备,和下一个开源许可(GPL第二)是可用的。我不知道它有多小可以缩小。还有CyaSSL,它也可以根据GPLv2条款获得,并声称可编译为30 KByte代码(最小选项)。

+0

刚刚在观看SSL协商的wireshark踪迹,我看到你对多个密码套件的含义。 Chrome广告多达21个! – Tim 2011-03-09 14:53:55

+0

@Jim全套密码套件已经超过100套。 – 2011-03-09 14:59:11

+0

太疯狂了!我的服务器是否支持绝大多数Chrome浏览器,或者至少绝大多数Chrome支持?我猜想我会选择一个与我的微控制器AES实现最兼容的产品。 – Tim 2011-03-09 22:03:41

0

SSL使用Diffie-Hellman(DH)密钥交换。我认为你可以在代码中相对容易地实现它(DH)。你需要考虑的唯一问题是,DH本身并不反对中间人(MITM)的攻击。有几个选项可以解决这个问题。维基百科的文章提到它们,所以你有一些事情可以从头开始。