【问题标题】:Lightweight encryption key exchange protocol轻量级加密密钥交换协议
【发布时间】:2011-07-11 22:27:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: encryption https embedded ssl


    【解决方案1】:

    SSL 使用Diffie-Hellman (DH) 进行密钥交换。我认为您可以在代码中相对轻松地实现它(DH)。您需要考虑的唯一问题是 DH 本身并不能抵抗中间人 (MITM) 攻击。有几个选项可以解决这个问题。维基百科文章提到了它们,所以你有一些东西可以开始。

    【讨论】:

      【解决方案2】:

      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 处理器,使用 thumb 指令编译的 C 代码),并且只需要 19 KB 的 RAM,其中 16 KB 用于输入缓冲区(输入记录的最大大小SSL,假设没有压缩,大约是 16 KB)。所以 SSL 可以小到足以容纳微控制器。

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

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

      【讨论】:

      • 刚刚观看了 SSL 协商的wireshark 跟踪,我明白您对多个“密码套件”的意思。 Chrome 的广告多达 21 个!
      • 这太疯狂了!我的服务器会支持其中的绝大多数,或者至少 Chrome 支持的绝大多数?我猜我会想选择一个与我的微控制器 AES 实现最兼容的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多