HTTP 请求的真实性和完整性

Authenticity and Integrity of HTTP Requests

我有一个 API 端点,外部网站可以在其中提交 POST 请求。 确保请求 真实 且未被篡改的最佳方法是什么,因此它们尊重 完整性 的原则?

由于数据不值钱,比如信用卡信息,我不需要 HTTPS 集成。

我已经查看了 HMAC 和数字签名,我相信第二种选择会更好,但我不确定这是否可行?

同样,对请求进行哈希处理并在我的服务器上对其进行验证就足够了吗?

HMAC 和数字签名都提供完整性和身份验证:

  • 完整性——因为它们都基于散列。 HMAC 是基于哈希的 消息验证码。数字签名是对某些消息的 hash 加密的。
  • 身份验证 - 因为 HMAC 使用对称密钥,而数字签名使用非对称私钥。 Secret/private 密钥只能与知道它的人一起使用 = 身份验证。在 HMAC 中检查接收方的 secret/private 密钥 - 接收方也知道秘密,这就是我们称之为对称的原因。在数字签名中检查收件人端的 secret/private 密钥 - 收件人还会获得 public 可以在受信任的第三方上检查的证书。

主要区别 - HMAC 消息不能被第三方checked/validated,只有知道秘密的人才能validate/authenticate消息。数字签名消息具有 public 证书,任何人都可以通过使用附加的 public 密钥解密消息、计算散列并检查 public 密钥来检查消息所有者在特别信任的一方。

结论 - 如果您不需要任何人能够检查某封邮件是否确实属于发件人,请使用 HMAC。

Similarly, would hashing the request and verifying it on my server be enough?

没有。中间人可以修改您的消息并附加修改消息的哈希值。散列提供完整性,这意味着消息修改也会更改散列,但黑客不必担心散列相等性,因为他只是用内容和散列完全替换消息! HMAC 中的一些秘密用法可防止此类消息替换:中间人仍然可以更改消息,但他无法重新计算哈希值,因为他不知道秘密。