encryption - 轻量级加密 key 交换协议(protocol)

标签 encryption https embedded ssl

我有一个嵌入式系统通过 HTTP 将数据发布到 JSON REST 服务。我目前正在使用 HMAC-SHA1 进行身份验证,方式与 Amazon AWS 相同做到了。

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

我研究过 SSL,它看起来相当复杂。还有其他更轻的选择吗?

最佳答案

SSL 的大部分复杂性来自高度模块化。客户端可能支持多个“密码套件”,服务器选择一个。数据可以被压缩。客户端可以通过出示自己的证书并使用相应的私钥来验证自己。服务器公钥作为 X.509 证书发送,X.509 证书验证很复杂。

您可以通过对客户端选项进行硬编码来显着简化 SSL。例如,您决定只支持一个密码套件,例如TLS_RSA_WITH_AES_128_CBC_SHA256。没有压缩。您可以在客户端硬编码服务器公钥,而忽略服务器发送的证书。如果可能,请使用 TLS 1.2 ,这需要使用单个哈希函数 (SHA-256) 而不是以前协议(protocol)版本的两个(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 KB)。因此 SSL 可以足够小以用于微 Controller 。

一旦您通过客户端选择的参数的先验选择简化了 SSL,您将获得一个尽可能轻量级的协议(protocol):剩下的复杂性是内在的。如果你试图让一些东西更简单,那么你最终会得到一些更弱的东西。

至于现有的实现,至少PolarSSL针对嵌入式设备,可在开源许可 (GPLv2) 下使用。我不知道它能缩小到多小。还有CyaSSL ,也可以根据 GPLv2 条款获得,并声称可以编译成 30 KB 的代码占用空间(具有最少的选项)。

关于encryption - 轻量级加密 key 交换协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5246831/

相关文章:

当从 cookie 中警告加密字符串时,Javascript + 字符被删除

.net - 如何在我的数据库中安全地存储第三方 Web 服务的密码?

ssl - GOlang/https : timeout waiting for client preface

embedded - stm32f4 上的 I2C 从接收器

c - 有微 Controller 的 C 标准吗?

java - Sha256 不提供 16 字节数组

javascript - 使用 Puppeteer 保存网页抓取密码的最安全方法是什么?

ssl - 发送 HTTP 请求时出错。 (无法从 mule HTTPS 连接到 openAM)

http - JSP - 无法维护 http 页面和 https 页面之间的 session

c - 内存地址如何放置在二进制文件中?