HMAC 在客户端和服务器之间分发共享密钥的安全方式是什么?

信息安全 验证 http hmac 休息
2021-08-15 01:01:14

我正在寻找使用 HMAC 保护 http 通信的方法。我的理解是,在这种情况下,客户端和服务器都知道一个秘密。这意味着必须首先在客户端(或服务器?哪一方重要?)上生成秘密。在这一点上,只有一方有秘密。秘密是如何传递给另一方的(或者如果没有传递一次,它怎么会知道它)?这不涉及发送一次吗?客户端和服务器怎么会知道这个秘密呢?如果在初始化期间发送它实际上是要做的事情,那么如何安全地完成呢?

现在我意识到可能会使用单独的通道,例如电子邮件等,但是如果您需要在没有用户参与的情况下自动使用建立 HMAC 怎么办?

3个回答

首先,HMAC 用于验证消息的发起者,只有发送者需要秘密。出于保密目的,它是无用的。其次,密钥交换是一件困难的事情。您可以通过辅助通道来完成,但由于这很难,这就是为什么大多数浏览器通过预先安装的与浏览器一起安装的根 CA 证书列表的方式为您完成此操作。这就是您的浏览器知道信任来自特定服务器的信息的方式。

由于服务器知道客户端可以信任的秘密,因此客户端可以发送只有服务器才能读取的会话密钥,然后该共享秘密可用于安全通信。这就是 SSL 背后的基础,也是 SSL 如此普遍使用的原因,否则您必须自己为每个客户端进行密钥分发。

编辑:正如 CodesInChaos 指出的那样,任何类型的加密都可用于验证 MAC 对授权方的消息是否有效。它不必是公共/私有的,但这并没有真正改变密钥交换是问题的事实,因为在这种特殊情况下,公共/私有比使用对称密钥更容易处理。

我认为你需要质疑你的约束。如果您能够使用 HTTP* S * 而不是 HTTP,那么您将能够将所有这些繁琐且容易出错的密钥交换协议委托给所涉及的浏览器或操作系统。

真的,这只是Diffie-Hellman 密钥交换,试图为旧问题创建新解决方案只会招来麻烦。

就像Henderson说的HMAC的设计是认证,你最好实现PGP在 PGP 中,双方不需要共享他们的私钥,只需将他们的公钥发送给对方用于加密数据。HMAC 还有助于检查数据完整性,因此如果您希望同时拥有安全通信、身份验证和数据完整性,您可以将 PGP 和 HMAC 结合起来。