我有一个嵌入式系统通过 HTTP 将数据发布到 JSON REST 服务。我目前正在使用 HMAC-SHA1 进行身份验证,方式与亚马逊AWS http://docs.amazonwebservices.com/AWSSimpleQueueService/2007-05-01/SQSDeveloperGuide/SummaryOfAuthentication.html可以。
我现在正在探索对传输中的数据进行加密的选项。 HTTPS 似乎是合理的选择,因为服务器端几乎不需要改变。然而,我的微控制器 http://www.luminarymicro.com/products/lm3s9b96.html具有相对较小的闪存 (256KB) 和 RAM (96KB),我能找到的唯一 HTTPS 客户端是商业产品。微控制器通过内置的“AES 加密查找表”使加密变得更简单,但我猜我需要一种安全的方式来交换密钥。
我研究过 SSL,它看起来相当复杂。还有其他更轻的选择吗?
SSL 的复杂性大部分来自于高度模块化。客户端可以支持多个“密码套件”,服务器选择一个。数据可以被压缩。客户端可以通过提供自己的证书并使用相应的私钥来验证自己的身份。服务器公钥作为 X.509 证书发送,X.509 证书验证很复杂。
您可以通过对客户端选择进行硬编码来大幅简化 SSL。例如,您决定仅支持一种密码套件,例如TLS_RSA_WITH_AES_128_CBC_SHA256。无压缩。您可以在客户端中硬编码服务器公钥,而忽略服务器发送的证书。如果可能的话,使用TLS 1.2 https://www.rfc-editor.org/rfc/rfc5246,这要求使用单个哈希函数 (SHA-256),而不是先前协议版本的两个哈希函数(MD5 和 SHA-1)(TLS 是 SSL 的标准名称;TLS 1.0 是 SSL 3.1)。
我(专业地)实现了一个 TLS 客户端,它支持 AES 和 3DES,并执行基本的 X.509 验证(仅限 RSA 签名)。完整的代码适合 21 KB 的 ROM(对于 ARM 处理器,用拇指指令编译的 C 代码),只需要 19 KB 的 RAM,其中 16 KB 用于输入缓冲区(输入记录的最大大小) SSL(假设没有压缩)大约为 16 KB)。所以SSLcan对于微控制器来说足够小。
一旦您通过预先选择客户端选择的参数来简化 SSL,您就会得到一个尽可能轻量级的协议:剩余的复杂性是固有的。如果你试图让一些东西变得更简单,那么你最终会得到一些更弱的东西。
对于现有的实现,至少PolarSSL http://polarssl.org/针对嵌入式设备,可在开源许可证 (GPLv2) 下使用。我不知道它能缩小到多小。还有CyaSSL http://www.yassl.com/,也可以根据 GPLv2 条款获得,并声称可编译成 30 KB 代码占用空间(具有最少的选项)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)