验证跨不安全传输边界的消息源

Verifying source of message across a unsafe transport boundary

我正在构建一个由 3 个部分组成的系统。 系统A、系统B、系统C.

系统A无法直接与系统C对话,需要通过系统B。 系统 B 可能包含许多系统 C。 这里还有一个问题是,系统 B 有可能创建自己的 copy/clone 并将其包含在自身之下(​​作为系统 C)。

我想从系统A向所有系统C广播消息。系统B包含它封装的所有系统C的列表。 我想在系统 C 中添加逻辑,其中只有来自系统 A 的消息才被视为有效(因此标记为安全以供进一步处理)。

作为第一步,我正在考虑通过 diffie-hellman 算法协商私钥。但意识到系统 B 可以创建自己的副本,将其作为系统 C 的实例包含在内并获取私钥。 是否有 better/standard 方法可以在系统 C 端验证源的真实性?

如果没有提前共享任何内容,C 就无法区分来自 A 的消息和来自 B 想要的消息冒充 A。在您的情况下,共享密钥将不起作用,因为这将允许 B 伪造消息。因此,您需要 A 的 public 密钥,BC 可用于验证消息,但只有 A 可用于 create/sign 条消息。

在我看来,每个系统 A 的简单 private/public 密钥就是您所需要的。

DH 完全没有参与其中。

系统 A 创建密钥对。系统 A 使用其秘密密钥对消息的哈希进行签名,并根据需要通过尽可能多的系统 B 将其发送出去。 系统 B 无法更改消息也无法导出私钥,因此他们所能做的就是不传递消息或重播消息(如果出现问题,您需要采取预防措施)。 系统 C 需要验证消息上 A 的签名它要么以某种方式知道系统 A 的 public 密钥,然后验证签名。

要拥有多个系统 A,让(所有)系统 C 知道所有系统 A public 密钥很快就会变得不切实际,以解决您对签署的证书颁发机构 (CA) 建立信任的问题系统 A 的证书,然后系统 C 信任该 CA 签名的证书。 (它不需要在线,也不需要能够与 CA 对话来做到这一点,信任可以很容易地离线)。

如果您确实要进行离线操作,请注意密钥(and/or 证书)可能需要更新,因此请预见一种机制。

如你所见,B 只是一个交通工具。