构建没有 SSL/TLS 的安全通道

信息安全 加密 tls 密码学 验证 http
2021-09-02 13:14:14

我正在寻找在多个具有有限加密功能的嵌入式设备和 HTTP 服务器(它可能是某种 Web 服务)之间建立安全通道的可能选项。

1. 背景

这些设备仅通过设备上的开发框架支持 HTTP、一些对称密钥算法和一些哈希函数。不幸的是,不支持 SSL/TLS,因此这里不是一个选项。

在启动时,设备会联系 HTTP 服务器以检索其特定配置。在这些设备被送到野外之前,我确实可以完全控制它们。

确定的一些威胁是:

  • 下载恶意配置文件。
  • 下载错误的配置文件(从另一台设备)。
  • 多次下载同一个配置文件。
  • 未经授权的第三方窃听配置文件。
  • 对 HTTP 服务器的欺诈性访问(此处不一定相关)。

检索配置文件的过程最好只发生一次。下载配置文件后,该特定设备将放弃对 HTTP 服务器的访问。

2. 提案

由于我可以在设备上加载临时共享密钥,然后再将它们放到野外,因此我正在考虑使用keyed-HMAC(哈希消息验证码)来验证设备,而无需通过网络发送密钥。类似于AWS API 身份验证设计的东西,并使用设备的唯一序列号作为密钥 ID。

一旦通过身份验证,设备就会被授予对资源的访问权限,在这种情况下是配置文件。为了减轻某些已识别的威胁,必须在传输过程中对配置文件进行加密和签名(?)。

为此,我正在考虑使用经过身份验证的加密模式。

我只能在 CBC模式下使用AES256和HMAC-SHA256框架内没有其他“适当的”经过身份验证的加密算法。

3. 问题

是否有意义?

为了避免在足够复杂的事情上增加复杂性,是否可以选择使用预加载的共享密钥作为 HMAC 函数的密钥和共享密钥哈希作为 AES 加密的加密密钥?

它是否允许在特定情况下减轻已识别的威胁?

可以简化流程并保持其安全属性吗?

3. 资源

如何选择经过身份验证的加密模式

经过身份验证的加密以及如何不被抓到追逐土狼

使用 AWS REST API 对请求进行身份验证

设计一个没有 OAuth 的安全 REST (Web) API

为什么我不能使用相同的密钥进行加密和 MAC?

1个回答

服务器和客户端都知道一些秘密,因此他们可以相信路由没有改变通信。实际上,通过它们之间的共享密钥使用连接就像在不握手的情况下使用 SSL。通常 SSL 将使用非对称加密来 a) 验证通信中的一个或多个参与方,以及 b) 为通信建立一个共享密钥。

但是,您可以在释放设备之前建立部分信任,因为两者都在您的手中。如果设备上的密钥没有被泄露(这取决于使用情况,这是主要的弱点),那么如果设备能够以正确解密来自设备的消息的方式进行通信。因此,您只需要担心重放攻击,但任何简单的机制都可以阻止这种攻击(例如,计数器或时间戳以避免重用或使用比当前消息更旧的消息。)