我偶然发现了一个代码,其中 HMAC 的密钥已被硬编码到 C# 客户端和服务器代码中。我看过 5 个关于 HMAC 的视频和许多文章,但没有一篇没有说明 HMAC 的密钥应该如何交换或存储。
有人可以详细说明这个问题吗?因为如果密钥是通过网络传输的,这会危及整个算法。如果您已经同时使用了 HTTPS,那么使用 HMAC 有什么意义吗?
我偶然发现了一个代码,其中 HMAC 的密钥已被硬编码到 C# 客户端和服务器代码中。我看过 5 个关于 HMAC 的视频和许多文章,但没有一篇没有说明 HMAC 的密钥应该如何交换或存储。
有人可以详细说明这个问题吗?因为如果密钥是通过网络传输的,这会危及整个算法。如果您已经同时使用了 HTTPS,那么使用 HMAC 有什么意义吗?
HMAC 提供消息完整性和身份验证。如果您收到一条带有正确 HMAC 的消息,您就知道:
由于发件人拥有密钥,因此您知道消息来自您将密钥提供给的人。如果仅将密钥分发给已知用户,则可以确定消息来自已知用户。
有时密钥由同一系统使用,不需要密钥交换。例如,网站上的密码重置功能可以创建 HMAC 并通过电子邮件发送。如果您单击电子邮件中的链接,同一站点将验证 HMAC。由于 HMAC 是由同一个软件创建和验证的,因此不需要验证。
在其他应用程序中,例如在 OpenID 中,每个客户端都与服务器共享其秘密。将客户端添加到 OpenID 时,您还需要指定 HMAC 操作的密钥。此配置步骤执行一次。
在您使用 C# 客户端和服务器的示例中,密钥是硬编码的。然后,服务器可以验证请求是否真的来自客户端。但是,从客户端提取密钥并伪造请求将非常容易。
HMAC 的密钥交换方法实际上没有任何意义。它可能在另一种加密机制中可用,但通常 HMAC 密钥是相当静态的。
最后你问这如何与 HTTPS 结合使用。HTTPS 提供服务器身份验证。您可以使用客户端证书来实现客户端身份验证,但默认情况下不启用此功能。使用 HTTPS,无法在传输过程中修改消息。因此,HMAC 解决方案唯一可以添加的是客户端身份验证。